704. 二分查找
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili首先代码如下
class Solution{
public:
int search(vector <int>& nums, int target) {
int left =0;
int right=nums.size() -1;
while(right>=left)
{
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;
}
};
其实主要考虑什么是左闭右闭 以及什么是左闭右开比如说 假设 int nums[10],如果此时left =0 right =9 那么此时就是左闭右闭,如果此时left =0 right =10 那么此时就是左闭右开
理解这个概念之后就需要想怎么用二分,其实就是分两半但是middle的取值要用上面的方法如果直接(left+right)/2在数值比较大的时候会直接溢出,导致报错或者出不来想要的结果
再然后就是考虑nums[left] nums[right]与target的比较
其实大家可以用笔画个图按照上面的代码演示一下left以及right和middle是怎么变化的就会好懂很多
27. 移除元素
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast=0;
int slow=0;
for(fast=0;fast<nums.size()-1;fast++)
{
if(nums[fast]!=val)
{
nums[slow++]=nums[fast];
}
}
return slow;
}
};
其实这里主要是看fast和slow的变化其实还是一样需要拿笔在纸上按照代码的思路走一遍就会好懂很多