Leetcode704 二分查找 https://leetcode.cn/problems/binary-search/submissions/494474207/
文档讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
状态:没做出来
思路:1.设置左右指针(默认左右指针闭区间) 2.判断左右指针的中位数(middle)是否等于目标值(target) 3.如果中位数大于目标值(nums[middle]>target),则将右指针设置为(middle-1)。如果中位数小于目标值(nums[middle]<target),则将左指针设置为(middle+1)。如果相等,则返回middle。
难点在于第三步左右指针区间不同,会影响左右指针的取值。左右指针双闭(左右指针都不能直接设置成middle),因为已经判断过middle是必定不等于 target的。左闭右开(nums[middle]>target可将right=middle),因为此时右边是开区间,右指针设置为middle并不会等于middle
Leetcode27 移除元素 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
状态:暴力求解做出来了(双循环)
思路:(双指针)由于题目要求删除数组中等于val的元素,我们可以把输出的数组直接写在输入数组上。可以使用双指针:fast 指向旧数组将要检索的元素,slow指针指向下一个将要赋值的位置。
(暴力求解)使用第一个循环检索val元素,第二个循环剔除val
左右双闭代码(704)
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(nums[middle]>target)
right=middle-1;
else if(nums[middle]<target)
left=middle+1;
else if(nums[middle]==target)
return middle;
}
return -1;
}
};
左闭右开代码(704)
class Solution {
public:
int search(vector<int>& nums, int target)
{
int left=0;
int right=nums.size();
while(left<right)
{
int middle=(left+right)/2;
if(nums[middle]>target)
right=middle;
else if(nums[middle]<target)
left=middle+1;
else if(nums[middle]==target)
return middle;
}
return -1;
}
};
暴力求解(27)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i,j,a,b;
a=0,b=0;
j=nums.size();
for (i=0;i<nums.size();i++)
{
if(nums[i]!=val)
{
for(j=i-a;j<=i-a;j++)
{
nums[j]=nums[i];
b++;
}
}
if(nums[i]==val)
{
a++;
}
if((nums[i]==val)&&(b==0))
{
j--;
}
}
return j;
}
};
双指针(27)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast,slow;
slow=0;
for(fast=0;fast<nums.size();fast++)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};