704.二分查找
https://leetcode.cn/problems/binary-search/
二分查找类似于查字典,每次找一半。需要注意的是二分时区间的选取。
大多数情况选用左闭右闭和左闭右开两种方式。
左闭右闭:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0,right = nums.size() - 1;
while(left <= right ){
int middle = left + (right - left) / 2 ;
if(nums[middle]>target)
right = middle-1;
else if (nums[middle]<target)
left = middle+1;
else
return middle;
}
return -1;
}
};
用[1,1]做例子可知left可以等于right,但是比较时不能用等于,会重复上次循环的数据,并且left,right必须+1
左闭右开:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0,right = nums.size() ;
while(left < right ){
int middle = left + (right - left) / 2 ;
if(nums[middle]>target)
right = middle;
else if (nums[middle]<target)
left = middle + 1;
else
return middle;
}
return -1;
}
};
用[1,1)做例子可知left不能等于right,所以left需要+1而right不需要
27.移除元素
https://leetcode.cn/problems/remove-element/
双指针法
快指针:遍历原数组
慢指针:形成新数组
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for(int fast = 0;fast < nums.size();fast ++ ){
if (val!=nums[fast]){
nums[slow++] = nums[fast];
}
}
return slow;
}
};
当fast不是对应要删去的元素时slow生成对应新数组的元素,当fast是对应要删去的元素时slow不动,等下一次fast对应不是要删去的元素时被slow覆盖