java二分有相同元素_算法:支持重复元素的二分查找

近几天在处理的一个项目,需要频繁对一些有序超大集合进行目标查找,二分查找算法是这类问题的最优解。但是java的Arrays.binarySearch()方法,如果集合中有重复元素,而且遇到目标元素正好是这些重复元素之一,该方法只能返回一个,并不能将所有的重复目标元素都返回,没办法,只能自造轮子了。

先复习下二分查找的经典算法:

1 private intbinarySearch1(Integer[] A, Integer x) {2 int low = 0, high = A.length - 1;3 while (low <=high) {4 int mid = (low + high) / 2;5 if(A[mid].equals(x)) {6 returnmid;7 } else if (x

思路很简单,先定位到中间元素,如果中间元素比目标元素大,则扔掉后一半,反之扔掉前一半,如果正好一次命中,直接返回。

略做改进:

1 private ListbinarySearch2(Integer[] A, Integer x) {2 List result = new ArrayList();3 int low = 0, high = A.length - 1;4 while (low <=high) {5 int mid = (low + high) / 2;6 if(A[mid].equals(x)) {7 if (mid > 0) {8 //看前一个元素是否=目标元素

9 if (A[mid - 1].equals(x)) {10 for (int i = mid - 1; i >= 0; i--) {11 if(A[i].equals(x)) {12 result.add(i);13 } else break;14 }15 }16 }17 result.add(x);18 if (mid

20 if (A[mid + 1].equals(x)) {21 for (int i = mid + 1; i <= high; i++) {22 if(A[i].equals(x)) {23 result.add(i);24 } else break;25 }26 }27 }28 returnresult;29 } else if (x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值