35. 搜索插入位置
本题的解法与704. 二分查找十分相似,题解见:https://blog.csdn.net/weixin_43926766/article/details/135829103
对于在数组中存在的元素来说直接返回它的下标即可。如果数组中不存在这个值,在最后一次while (left<right)的循环中会将right设为它应该插入的位置。因为最后一次循环时,left与right对应的数组元素已经是相邻元素,middle按照表达式和int向下取整的规则会被设为left,如果target比left还小(如target值比整个数组所有元素都小的情况),就需要插入在left的位置,但此时right也会被设为left,就是我们要找的位置。如果target比left大,那么自然是插在right的位置。因此在循环结束后如果还没有返回值,直接返回right即可。
参考答案
本题代码与704. 二分查找的区别也只在于最后的返回值。
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length;
while (left < right) {
int middle = left + ((right - left) >> 1);
if (target < nums[middle]) {
right = middle;
} else if (target > nums[middle]) {
left = middle + 1;
} else {
return middle;
}
}
return right;
}
}
34. 在排序数组中查找元素的第一个和最后一个位置
本题要求找出给定目标值在数组中的开始位置和结束位置,分开计算开始位置和结束位置比较好写,可以将计算开始位置和计算结束位置写成两个方法。同时对于target不在数组中的情况,返回[-1, -1]。
参考答案
class Solution {
public int[] searchRange(int[] nums, int target) {
int RightBorder = getRightBorder(nums, target);
int LeftBorder = getLeftBorder(nums, target);
if (RightBorder == -2 || LeftBorder == -2) {
return new int[]{-1,-1};
} else if (RightBorder - LeftBorder >= 0){
return new int[]{LeftBorder,RightBorder};
} else {
return new int[]{-1,-1};
}
}
public int getRightBorder(int[] nums, int target) {
int left = 0;
int right = nums.length;
int rightBorder = -2;
while (left < right) {
int middle = left + ((right - left) >> 1);
if (target < nums[middle]) {
right = middle;
} else {
left = middle + 1;
rightBorder = middle;
}
}
return rightBorder;
}
public int getLeftBorder(int[] nums, int target) {
int left = 0;
int right = nums.length;
int leftBorder = -2;
while (left < right) {
int middle = left + ((right - left) >> 1);
if (target > nums[middle]) {
left = middle + 1;
} else {
right = middle;
leftBorder = middle;
}
}
return leftBorder;
}
}