查找算法
二分查找
NC105
题目:请实现有重复数字的升序数组的二分查找。给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1
思路:因为是找到重复数字的最小索引,所以需要尽可能往左走。首先对于 middle 的取值,(left + right) >> 1 和 (left + right + 1) >> 1 对于长度为奇数的数组都没有影响,对于长度为偶数的数组 (left + right) >> 1 可以保证索引是偏左的。所以选择使用它。之后就是区间的不断缩小,对 middle 值判定之后,无论是更新 left 还是 right 均选择不包括 middle。最后是循环条件的选择,因为每次 right 和 left 总会有一个变化,然后考虑到 left 和 right 相等时那个值也需要判断,所以退出循环的条件选择是 <= 而不是 <。
代码实现:
import java.util.*;
public class Solution {
public int search (int[] nums, int target) {
int index = -1;
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int middle = (left + right) >> 1;
if (nums[middle] == target) {
index = middle;
right = middle - 1;
continue;
}
if (nums[middle] > target) {
right = middle - 1;
continue;
}
if (nums[middle] < target) {
left = middle + 1;
}
}
return index;
}
}