题目链接:704.二分查找
二分法逻辑并不算难,但在边界条件可能会出现问题
(1)定义target在一个左闭右闭的区间,即[left,right],此时left===right在[left,right]上是有意义的,因而在while(left<=right)中,需要考虑到left==right这种情况。区间变换的逻辑也应该为
if(nums[mid]>target) right=mid-1;
if(nums[mid]<target) left=mid+1;
代码如下:
c++:
//左闭右闭:[left,right]
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<=right)
{
int 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;
}
};
(2)定义target在一个左闭右开的区间,即[left,right),显然,此时left===right在[left,right)上是有意义的,因而在while(left<right)中,需要排除left==right这种情况,另外right的初始值也应该改为nums.size()。区间变换的逻辑也应该为
if(nums[mid]>target) right=mid;
if(nums[mid]<target) left=mid+1;
代码如下:
c++:
//左闭右开:[left,right)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size();
while(left<right)
{
int mid=left+((right-left)/2);
if(nums[mid]>target)
right=mid;
else if(nums[mid]<target)
left=mid+1;
else
return mid;
}
return -1;
}
};
注意事项:在定义mid的值时,考虑到溢出的问题,应该将
int mid=(left+right)/2;优化为int mid=left+((right-left)/2);
从而避免产生right初始值为INT_MAX时,导致的left+right溢出的问题
题目链接:27.移除元素
这是一道很经典的双指针问题
c++:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=val)
nums[slowIndex++]=nums[i];
}
return slowIndex;
}
};