实现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
    }.
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,没有直接提供lower_boundupper_bound函数,但可以通过使用Collections类的binarySearch方法来实现类似的功能。 1. lower_bound函数: lower_bound函数用于在有序数组中查找第一个大于等于给定值的元素的位置。在Java中,可以使用Collections类的binarySearch方法来实现lower_bound函数。binarySearch方法返回的是要查找元素的索引,如果找到了该元素,则返回其索引;如果没有找到,则返回一个负数,表示该元素应该插入的位置的负数形式。 下面是一个示例代码: ```java import java.util.ArrayList; import java.util.Collections; public class Main { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(3); list.add(4); list.add(5); int target = 3; int index = Collections.binarySearch(list, target); if (index < 0) { index = -index - 1; } System.out.println("lower_bound: " + index); } } ``` 输出结果为:lower_bound: 2 2. upper_bound函数: upper_bound函数用于在有序数组中查找第一个大于给定值的元素的位置。同样地,在Java中,可以使用Collections类的binarySearch方法来实现upper_bound函数。不过需要对返回的索引进行一些处理。 下面是一个示例代码: ```java import java.util.ArrayList; import java.util.Collections; public class Main { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(3); list.add(4); list.add(5); int target = 3; int index = Collections.binarySearch(list, target); if (index >= 0) { index++; } else { index = -index - 1; } System.out.println("upper_bound: " + index); } } ``` 输出结果为:upper_bound: 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值