704.二分法
1.左闭右闭区间
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right)//左闭右闭区间
{
int mid=left+((right-left)/2);
if(target<nums[mid]){ //不能等于target 是因为 右闭 代表已经搜索过mid这个值了
right=mid-1;
}
else if(target>nums[mid]){
left=mid+1;
}
else if(target==nums[mid]){
return mid;
}
}
return -1;
}
};
2.左闭右开区间
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size();//左闭右开
while(left<right){
int mid=(left+right)/2;
if(nums[mid]<target){
left=mid+1;
}else if(nums[mid]>target){
right=mid;
}else{
return mid;
}
}
return -1;
}
};
27.移出元素
做了很多次了,这次忽然注意到一点,就是nums.size()不能-1 ,会报错数组越界了,卡了一会,后来想明白了,是因为nums.size() vector的size函数的返回值是无符号整数,空数组时返回0,在-1会溢出。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
for(int fast=0;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
}
return slow;
}
};