题目一
题目链接
思路请查看
代码
class Solution {
public int search(int[] nums, int target) {
if (target < nums[0] || target > nums[nums.length - 1]) {//依据最大最小值判断是否存在
return -1;
}
int left=0;
int right=nums.length-1;
int mid=0;
while(right>=left){//闭区间
mid=left+(right-left)/2;
if(nums[mid]>target){
right=mid-1;
}
else if(nums[mid]<target){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
}
题目二
题目链接
思路
这个问题是经典的二分查找的变体,叫做搜索插入位置问题(Search Insert Position)。其目的是在一个有序数组中找到目标值的位置,如果目标值不存在于数组中,则返回它应该被插入的位置,以保持数组的有序性。
二分查找过程
-
初始化边界:
left
初始化为数组的第一个位置(索引0)。right
初始化为数组的最后一个位置(索引nums.length - 1
)。
-
循环查找:
- 在每次循环中,计算中间位置
middle
。 - 比较
nums[middle]
与target
:- 如果
nums[middle]
小于target
,则目标值应该在middle
右侧,调整left
为middle + 1
。 - 如果
nums[middle]
大于target
,则目标值应该在middle
左侧,调整right
为middle - 1
。 - 如果
nums[middle]
等于target
,则返回middle
作为目标值的位置。
- 如果
- 在每次循环中,计算中间位置
-
返回结果:
- 循环结束后,
left
是目标值应该插入的位置。
- 循环结束后,
为什么返回left?
如果有一个数组[x,x+2,x+4],当插入x+3,最后会有left=2,right=1,如果插入x+1会有left=1,right=0,如果插入x-1会有left=0,right=-1,如果插入x+5会有left=3,right=2
代码如下
class Solution {
public int searchInsert(int[] nums, int target) {
int left=0;
int right=nums.length-1;
while(right>=left){
int middle=left+((right-left)/2);
if(nums[middle]<target){
left=middle+1;
}
else if(nums[middle]>target){
right=middle-1;
}
else{
return middle;
}
}
return left;
}
}