代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

704、二分查找

写在之前:之前一直是在用牛客刷题,突然用力扣没了智能提示还有点不习惯,慢慢来吧(吐槽:力扣调试还要升级会员,牛客不要,不过这也可以让我自己学会如何使用自己的编译器进行调试)

思路:很明显的使用二分法来回答此题目,用暴力法也可解决,最开始的思路则是额外写一个二分法函数直接进行调用。

其中个人认为需要注意的点是边界的处理,我最一开始便是没有注意到边界条件的处理导致了时间超限和解答错误,例如nums[mid]和target比较之后的left或者right是直接等于mid还是要加1或者减1,如果这里没有处理好则一些特殊情况会不正确,我其实并没有在错误后选择改正边界条件的判断,而是选择直接先排除掉特殊情况,结果就是这样的时间用得还更少了。

class Solution {
public:
    int Binary(vector& nums,int begin,int end,int target)
    {
        while(begin < end)
        {
            int mid = (begin + end) / 2;
            if(nums[mid] == target)
            return mid;
            else if(nums[mid] > target)
            {
                end = mid;
            }
            else if(nums[mid] < target)
            {
                begin = mid + 1;
            }
        }
        return -1;
    }
    int search(vector& nums, int target) {
        int start = 0;
        int over = nums.size() - 1;
        if(nums.size() == 1 && nums[0] == target)
        return 0;
        if(nums[0] == target || nums[over] == target)//此处用于排除target值直接一开始就和nums[0]或者nums[nums.size() - 1]相等,也是因为我的二分函数无法完成这种特殊情况才想到这样写
        return nums[0] == target?0:over;
        return Binary(nums,start,over,target);
    }
};

后续:看完代码随想录之后才发现正确的处理边界的条件,left应该设置为小于等于right,每次比较完之后都应该+1或者-1。

收获:再次熟悉了二分法中边界条件的处理。

27、移除元素

思路过程:最开始的思路是想直接使用vector的erase()方法,既能直接删除元素又能直接减小vector的size,结果就是不支持,随后便是正常的思考过程,先找到指定值,使用一个变量来记录找到的次数,再将指定值设置为一个较大的数,随后使用sort方法直接进行排序,最后返回原来的size减去找到的次数。

代码:

class Solution {
public:
    int removeElement(vector& nums, int val) {
        if(val > 50)
        return nums.size();//题目中写的nums[i]不超过50,若val超过50便可以直接返回
        int count = 0;
        for(auto it = nums.begin();it != nums.end();it++)
        {
            if(*it == val)
            {
                *it = 101;
                count++;
            }
        }
        sort(nums.begin(),nums.end());
        return nums.size() - count;
    }
};

看完书之后的想法:双指针法:我的理解为:慢指针用来停留在指定值val的地方,快指针fast往后遍历,只要与指定值val不同,就将其覆盖到慢指针slow,题目已经说了顺序无所谓,所以快指针只管往后遍历就行,将所有慢指针停留的地方(即慢指针指向了指定值val)覆盖就行。

收获:熟悉了双指针在移除元素中的用法

你可能感兴趣的:(算法)