Leetcode 704 二分查找
重点:区分 左闭右闭 和 左闭右开 以及 什么时候用middle 什么时候用 middle-1
左闭右闭
用于right也被计入的情况 ,此时在经过一轮target寻找之后,若 target < nums[middle],说明应该查找左边区间,此时middle已经被计入过是否等于target的判断,所以在下一轮循环中 right = middle - 1,left = middle + 1
左闭右开
用于right不被计入的情况,此时在经过一轮target寻找之后,若 target < nums[middle],说明应该查找左边区间,此时middle不会参与下一轮是否等于target的判断,所以在下一轮循环中 right = middle, left = middle + 1
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()==0) return -1;
int left=0;
int right=nums.size()-1;
while(left<=right){
int middle= left+ (right-left)/2;
if(target==nums[middle]) return middle;
else if(target<nums[middle])
{
right=middle-1;
}
else {
left=middle+1;
}
}
return -1;
}
};
Leetcode 27 移除元素
思想:这个题我使用了双指针 分别在头和尾设置一个指针 向中间移动 在右边元素不为val的情况下 当遇到左边的值等于val的时候 则交换左边和右边的元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int number = nums.size();//数组元素个数
int count=0;//等于val的元素个数
for(int i=0;i<number;i++){
if(nums[i]==val) count++;
}
int front=0;
int back=nums.size()-1;
while(front<back){
if(nums[back]==val) back--;
else if(nums[front]==val){
int temp = nums[front];
nums[front] = nums[back];
nums[back] = temp;
front++;
}
else front++;
}
return number-count;//因为front是从0开始计数的所以
}
};
今日收获:对于二分查找中 什么时候用left<=right,什么时候用left<right,以及什么时候用middle,什么时候用middle-1,有了清晰的认识。明白了erase库函数的底层逻辑,了解了快慢指针的用法,比如说快指针在题目中的含义,慢指针在题目中的含义。
今天的任务比较轻松,写代码的时间大概在1个小时