代码随想录算法训练营第一天|Leecode 704 二分查找,Leecode 37 移除元素
开始第一天的博客打卡之前,推荐用vscode刷Leecode题目,分类很全,而且看的也非常美观,[配置教程链接]【VSCode】 VSCode配置LeetCode插件_leetcode vscode自定义输入-CSDN博客
Leecode 704 二分查找
题目链接 704. 二分查找
视频链接 https://www.bilibili.com/video/BV1fA4y1o715
文章链接 https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
思路
这道题目之前见过很多次,就是很经典的用二分查找来做,前提是这道题说明有数组有序(升序),并且元素不会重复。二分查找的步骤相对来说比较简单,定义一个区间,从这个区间的中点找起,如果数组对应中点下标的值小于目标值,则目标值肯定在中点目标值的右边,更新区间左端点,大于同理,等于就说明中点下标对应数组的值是目标值,返回中点下标即可。要注意区间的范围(左闭右闭,左闭右开)
代码
- 左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
int middle = 0;
while(left<=right){
middle = left+(right-left)/2;//有个细节,right+left可能会炸int,这种写法比较保险
if(nums[middle]>target) right = middle-1;
else if(nums[middle]<target) left = middle+1;
else return middle;
}
return -1;
}
};
- 左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
int middle = 0;
while(left<right){
middle = left+(right-left)/2;
if(nums[middle]>target) right = middle;
else if(nums[middle]<target) left = middle+1;
else return middle;
}
return -1;
}
};
本题收获:之前在做的时候一直没有考虑区间具体范围问题,一直在试,过了就万事大吉,看了卡哥的讲解之后,对两种写法有了更深刻的认识,左闭右闭,取中间值下表上一个或者下一个,依然是闭区间且所有值都能取到,左闭右开,初始化右端点要等于数组末端点加一,且开区间的右端点只需更新中间值下标即可(因为开区间取不到)
Leecode 37 移除元素
题目链接 37 移除元素
视频链接 https://www.bilibili.com/video/BV12A4y1Z7LP
文章链接 https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
思路
这道题感觉思路比较明确,直接定义两个变量(看了卡哥的文章才知道这种解法其实试双指针),一个变量用于遍历整个数组,即快指针,一个变量用于从头更新数组中满足条件的值,即慢指针。
代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
int slow = 0;
int fast = 0;
for(fast=0;fast<nums.size();fast++){
if(val!=nums[fast]){
nums[slow++] = nums[fast];//从头存不是val的值
}
}
return slow;
}
};