刷题重来,打算按专题开始搞,看看前辈的经验,总结一下
数组专题
二分法的判断:
如果我认为target在[left,right]里,那么我的判断条件应该定为left<=right,如果出了我的判断,那么只可能会是 right在left的左边,这时候最佳的插入位置为left或者right+1;
同理如果我认为target在[left,right)里,那么判断条件应该为left<right,这样的话如果出了我的判断结束条件,只可能会是left=right,这时候最佳的插入位置为left或者right都可以
以第35. 搜索插入位置为例
class Solution35 {
public:
//如果我认为target在[left,right]里,那么我的判断条件应该定为left<=right,如果出了我的判断,那么只可能会是 right在left的左边,这时候最佳的插入位置为left或者right+1;
int searchInsert1(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]) {
right = mid - 1;
}
else if (target > nums[mid]) {
left = mid + 1;
}
else{
return mid;
}
}
return right + 1;
}
//同理如果我认为target在[left,right)里,那么判断条件应该为left<right,这样的话如果出了我的判断结束条件,只可能会是left=right,这时候最佳的插入位置为left或者right都可以
int searchInsert2(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
int mid = 0;
while (left < right) {
mid = (left + right) / 2;
if (target < nums[mid]) {
right = mid;
}
else if (target > nums[mid]) {
left = mid + 1;
}
else {
return mid;
}
}
return right;
}
};