标签:start 解释 search 存在 div binary color 初学者 查找算法
描述:
给定一个排序的整数数组(升序)和一个要查找的整数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]一定就是查找数.
标签:start 解释 search 存在 div binary color 初学者 查找算法
原文地址:https://www.cnblogs.com/S-Evildoer/p/10957492.html