二分查找模板和一个它的一个有用的变体的模板
二分查找模板
public int binarySearch(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (left + right) >> 1;
if (nums[mid] < target) left = mid + 1;
else if (nums[mid] > target) right = mid - 1;
else return mid;
}
return -1;
}
二分查找的一个变体的模板
将上述二分查找的模板稍作改变,即可得到一个有用的变体。
其作用为:对于一个排序的数组 nums ,找到要将 target 插入其中时应该插入的位置,并返回该位置的下标(若数组中有与 target 相同的元素,则将 target 插入到这些元素的后面一个位置)。
public int binaryInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (left + right) >> 1;
if (nums[mid] <= target) left = mid + 1;
else right = mid - 1;
}
return left;
}
该算法可以应用于许多问题中。
例如,找到 target 在数组中出现的第一个位置(以 target - 1 为参数)和最后一个位置(以 target 为参数)。