代码随想录算法训练营第一天

发布时间 2024-01-12 00:52:33作者: 叶永旗

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;
    }
};