leetcode-34:寻找左右边界
Tips:
对于闭区间来讲,l <= r 是比较便于理解的
如何左右边界分别取左右哪个指针判断?假设指针相遇的时候,我需要得到左边界,有两种得到的方法,一是让左指针倒反天罡往左走格,二是要右指针向左走一格,同时要满足跳出while(l<=r)的循环,必须要满足 l > r,那么就必然是右指针执行最后一动跳出循环
如何理解得到左右边界后的条件判断?假设target在左边界外,那么一直在动的一定是它的右指针,右指针对应的左边界,那么左边界一定是不断更新的,右指针一定是不更新的,所以右指针为-2,同理在右边界以外的数字左边界是-2,便可以判断
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int leftborder = getLeftBorder(nums,target);
int rightborder = getRightBorder(nums,target);
if(leftborder == -2 || rightborder == -2)return {-1,-1};
if ( rightborder - leftborder > 1)return {leftborder+1,rightborder-1};
return {-1,-1};
}
private:
int getLeftBorder(vector<int>& nums,int target){
int left = 0 , right = nums.size() - 1 , middle , leftborder = -2;
while(left <= right){
middle = left + (right - left) / 2;
if(nums[middle] >= target){
right = middle - 1;
leftborder = right;
}else{
left = middle + 1;
}
}
return leftborder;
}
private:
int getRightBorder(vector<int>& nums,int target){
int left = 0 , right = nums.size() - 1 , middle , rightborder = -2;
while(left <= right){
middle = left + (right - left) / 2;
if(nums[middle] > target){
right = middle - 1;
}else{
left = middle + 1;
rightborder = left;
}
}
return rightborder;
}
};
leetcode-69:平方根
Tips:
每次写完以后代入数据试一下,注意return的是right不是middle
为什么不return left?这样想 1的平方根才是他自己,倘若小于1,其平方根才可能要return左边界
class Solution {
public:
int mySqrt(int x) {
long long left = 0 , right = x , middle;
while(left <= right){
middle = left + ( right - left ) / 2;
if(middle * middle > x){
right = middle - 1;
}else if(middle * middle < x){
left = middle + 1;
}else{
return middle;
}
}
return right;
}
};
浙公网安备 33010602011771号