Leetcode 35 [Easy]
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
输入: [1,3,5,6], 5 输出: 2
题目难度并不大,用简单遍历也能做,但如果要选择二分则需要注意许多细节问题:
//寻找函数
public int searchInsert(int[] nums, int target) {
int l = 0;
int r = nums.length - 1;
//注意停止条件,在某些题目中,ans允许超出开始的边界,此时需要指定结果返回l,并l=mid+1(使得l可以超出界限)
//而另外,在=条件存在的情况下,在check函数的分支中,也需要对l和r都进行调整,如果不调整,可能会陷入死循环
//l和r并不一定需要相等,他们只是一个标识符,当l与r之间的条件满足时,说明答案已经出来了,因此不需要强求l和r的步调一致
while (l <= r) {
int mid = l + r + 1 >> 1;
//抽象check函数
if (check(nums, mid, target)) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return l;
}
//判定函数
public boolean check(int[] nums, int index, int target) {
return nums[index] < target;
}
二分的题目基本都是一个框架,真正的难点在于确定二分边界以及check函数。