实现list容器的lower_bound和upper_bound

  • 实现list容器的upper_bound
  • 这里用到了比较函数compareTo 我们继承了Comparable
<T extends Comparable<? super T>> 分析:T表示任意字符名,
extends对泛型上限进行了限制即T必须是Comparable<? super T>的子类,
然后<? super T>表示Comparable<>中的类型下限为T(如果T的父类实现了Comparable接口,而
T没有实现,那么T也可以使用Comparable)
public class Collections{
     /**
     * @ 实现list容器的lowe_bound 返回list容器第一个大于等于key的数的位置 不存在则返回-1
     * @ param list
     * @ param key
     * @ return int
     * @ create by ostreamBaba on 下午5:30 18-9-11
     */
    public static <T> int lower_bound(List<? extends Comparable<? super T>> list,T key){
        int low=0;
        int high=list.size();
        while (low<high){
            int mid=(low+high)>>>1;
            Comparable<? super T> midVal=list.get(mid);
            int tmp=midVal.compareTo(key);
            if(tmp<0){
                low=mid+1;
            }else{
                high=mid;
            }
        }
        return low==list.size()?-1:low;
    }

    /**
     * @ 实现list容器的upper_bound 返回list容器第一个大于key的数的位置 不存在则返回-1
     * @ param list
     * @ param key
     * @ return int
     * @ create by ostreamBaba on 下午5:29 18-9-11
     */

    public static <T> int upper_bound(List<? extends Comparable<? super T>> list,T key){
        int low=0;
        int high=list.size();
        while (low<high){
            int mid=(low+high)>>>1;
            Comparable<? super T> midVal=list.get(mid);
            int tmp=midVal.compareTo(key);
            if(tmp<=0){
                low=mid+1;
            }else{
                high=mid;
            }
        }
        return low==list.size()?-1:low;
    }

    @Test
    public void test(){
        List<Integer> list=new ArrayList<Integer>(Arrays.asList(2,3,3,4,5));
        assert lower_bound(list,3)==1;
        assert lower_bound(list,6)==-1;
        assert upper_bound(list,6)==-1;
    }
}
  • 普通数据类型 upper_bound和lower_bound
public class Arrays {
    /**
     * @ 查找数组中第一个大于等于target的数的位置 若找不到则返回-1
     * @ param arr
     * @ param target
     * @ return int
     * @ create by ostreamBaba on 下午2:58 18-9-11
     */
    public static int lower_bound(int[] arr,int target){
        int l=0;
        int r=arr.length;
        while (l<r){
            int mid=l+(r-l)/2;
            if(arr[mid]>=target){
                r=mid;
            }else{
                l=mid+1;
            }
        }
        return l==arr.length?-1:l;
    }
    /**
     * @ 寻找数组中第一个大于target的数的位置 若找不到则返回-1
     * @ param arr
     * @ param target
     * @ return int
     * @ create by ostreamBaba on 下午2:59 18-9-11
     */
    public static int upper_bound(int[] arr,int target){
        int l=0;
        int r=arr.length;
        while (l<r){
            int mid=l+(r-l)/2;
            if(arr[mid]>target){
                r=mid;
            }else{
                l=mid+1;
            }
        }
        return l==arr.length?-1:l;
    }
    @Test
    public void test(){
        int[] a={2,3,4,4,5};
        assert lower_bound(a,5)==4; //测试lower_bound
        assert upper_bound(a,4)==4; //测试upper_bound
    }.
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值