二分查找
力扣https://leetcode.cn/problems/binary-search/
解题思路:
用两个left,right变量来表示区间的范围,通过改变区间的范围来确定最终是否停留的位置。
注意:
1. 区间right是nums.size()-1
2. 循环结束的条件——left本应该小于等于right,当left大于right时,循环结束
3. return可以直接退出循环,不需要再加break
题解:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;//don't forget -1
while (left <= right){
int mid = (left + right)/2;
if (target == nums[mid]){
return mid;
}else if (target < nums[mid]){
right = mid - 1;
}else{//target>nums[mid]
left = mid + 1;
}
}
return -1;//not found
}
};
搜索插入位置
力扣https://leetcode.cn/problems/search-insert-position/
解题思路
还是二分查找的题目,最后判断插入位置有一点不同
这里有个小坑,就是target小于nums[mid]的时候,插入的位置应该是mid,而不是mid-1
题解
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int mid = 0;
while (left <= right){
mid = (left + right) / 2;
if (target == nums[mid]){
return mid;
}else if (target < nums[mid]){
right = mid - 1;
}else{//target > nums[mid]
left = mid + 1;
}
}
//where to insert
if (target < nums[mid]){
return mid;//error-prone
}else{
return mid+1;
}
}
};