LintCode刷题---二分查找
Posted s-evildoer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LintCode刷题---二分查找相关的知识,希望对你有一定的参考价值。
描述:
给定一个排序的整数数组(升序)和一个要查找的整数target
,用O(logn)
的时间查找到target第一次出现的下标(从0开 始),如果target不存在于数组中,返回-1
。
样例 :
输入: [1, 2, 3, 3, 4, 5, 10], 3
输出
: 2
样例解释:
3 第一次出现在第2个
解题:
难点分析:
注意数组中存在着重复数据, 而利用二分查找找出来的数据不一定是第一个, 数据需要检验.
public int binarySearch(int[] nums, int target) // write your code here if(nums == null || nums.length == 0) return -1; int start = 0; int end = nums.length-1; while(start < end) int mid = (start + end) / 2; if(target == nums[mid]) end = mid; else if(target <= nums[mid]) end = mid - 1; else if(target >= nums[mid]) start = mid +1; if(target == nums[start]) return start; return -1;
代码也没什么难度, 在LintCode中也是属于下游水平,(初学者)
首先需要判断的是数组是否为空, 空就不需要二分查找了,
while中就是二分查找算法, 稍有修改
值得注意的地方就是--当中间数nums[mid] 为查找数时, 这个数不一定就是第一个, 另 end=mid 再次二分查找,
寻找是否还有前面的数也是查找数, 没有时start = end 循环就会退出, 而此时的 end = mid;
最后一个if检验查找数是否在数组中, 是时 nums[start]一定就是查找数.
以上是关于LintCode刷题---二分查找的主要内容,如果未能解决你的问题,请参考以下文章