LeetCode 704.二分查找
左闭右闭区间:left<=right
left和right都包含,所以left和right都不能等于middle。因为当前这个nums[middle]一定不是target
左闭右开区间:left<right
left包含而right不包含,right等于middle下一次区间也还是左闭右开,不会算middle
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size();
while(left<right){
int middle=(left+right)/2;
if(nums[middle]>target){
right=middle;
}else if(nums[middle]<target){
left=middle+1;
}else{
return middle;
}
}
return -1;
}
};
LeetCode 27.移除元素
暴力解法:迭代器的经典用法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
auto it=nums.begin();
for(;it!=nums.end();){
if((*it)==val){
it=nums.erase(it);
}else{
++it;
}
}
int len=nums.size();
return len;
}
};
双指针解法:画个图,还是很好理解的
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//双指针法
int slow=0;
int size=nums.size();
for(int fast=0;fast<size;++fast){
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
}
return slow;
}
};