leetcode704. 二分查找
解法一、
最基础的写法,适合没有重复数据的数组左闭右闭[l,r]
class Solution {
public:
int search(vector<int>& nums, int target) {
int l=0;
int r=nums.size()-1;
while(l<=r){
int mid=l+(r-l)/2;//防止数据溢出
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
r=mid-1;
}else{
l=mid+1;
}
}
return -1;
}
};
解法二、
左闭右开区间[l,r),那边开就往哪边收缩
class Solution {
public:
int search(vector<int>& nums, int target) {
int l=0;
int r=nums.size();
while(l<r){
int mid=l+(r-l)/2;//防止数据溢出
if(nums[mid]>target){
r=mid;
}else if(nums[mid]<target){
l=mid+1;
}else{
return mid;
}
}
return -1;
}
};
leetcode27. 移除元素
原地移动数组,易错点在双指针从左向右遍历的时候与后面位置交换的时候记得回退指针,指针重合后就结束循环
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int flag=nums.size()-1;
for(int i=0;i<=flag;i++){
if(nums[i]==val){
int t=nums[i];
nums[i]=nums[flag];
nums[flag]=t;
flag--;
i--;
}
}
return flag+1;
}
};