704.二分查找法
题目链接:https://leetcode.cn/problems/binary-search/
文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
1. 易错点:
-
while(left < right)
while(left <= right)
-
if (nums[middle] > target) right = middle
if (nums[middle] > target) right = middle - 1
2. 左开右闭写法 [left, right]
left = 0;
right = numsize - 1;
while(left <= right){ //[1,1]合法
middle = (left + right) / 2; //注意两个int型相加可能越界
if(nums[middle] > target) //更新左区间的右边界
right = middle - 1; //下一个区间的搜索不包含nums[middle]
else if(nums[middle] < target) //更新右区间的左边界
left = middle + 1;
else return middle;
}
3. 左闭右开写法 [left, right)
left = 0;
right = numsize;
while(left < right){ //[1,1]不合法
middle = (left + right) / 2; //注意两个int型相加可能越界
if(nums[middle] > target) //更新左区间的右边界
right = middle;
else if(nums[middle] < target) //更新右区间的左边界
left = middle + 1;
else return middle;
}
C++题解
本题为左闭右闭写法,时间复杂度O(log n)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right)
{
int middle = (left + right) / 2;
if(target < nums[middle])
right = middle - 1;
else if (target > nums[middle])
left = middle + 1;
else return middle;
}
return -1;
}
};
27.移除元素
题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
思路
因为数组是连续的,要删除其中某一个元素,不能直接删除,只能让后面的元素整体向前移一位,覆盖前面的元素。
C++中erase函数用来删除数组中的元素,时间复杂度为O(n)。如果题目用库函数能直接解决,就不要用库函数。本题就是要实现erase函数删除元素的过程。
解法一:暴力求解 O(n^2)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for(int i = 0; i < size; i++){
if(nums[i] == val){
for(int j = i + 1; j < size; j++){
nums[j - 1] = nums[j];
}
i--; //易错,因为i已被覆盖,所以i要前移一位
size--;
}
}
return size;
}
};
解法二:双指针 O(n)
定义一个新指针,指向新数组所需要的元素;定义一个慢指针,指向我们需要更新的元素。将快指针获取到的值赋给慢指针
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for(int fastIndex = 0; fastIndex < nums.size(); fastIndex++){
if(nums[fastIndex] != val){
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
};