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

704 二分查找

题目链接:704.二分查找

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int min,max,flag;
        min = 0;
        max = nums.size()-1;
        while(min<=max){
            flag = (min+max)/2;
            if(target==nums[flag]){
                return flag;
            }else if(target>nums[flag]){
                min = flag+1;
            }else if(target<nums[flag]){
                max = flag-1;
            }
        }
        return -1;
    }
};

这道题已经做过非常多遍了,所以举个例子比比划划很快就AC了。需要注意的是while的条件和min、max以及中值的选取,举几个例子试一试其实就挺清楚了。

27 移除元素

题目链接:27移除元素

参考学习链接:数组中移除元素并不容易

代码随想录移除元素

双指针法

快指针p:用来寻找旧数组中需要删除的 元素

慢指针q:则指向新数组所需要的元素

那么两个指针如何进行挪动完成元素的移除呢?

思路是:快指针采用for进行循环,一直在往后移,快指针还没遇到需要移除的元素的时候,q指针会跟着往后挪,不断的把旧数组中的元素放进新数组中。当快指针找到需要移除的元素时,慢指针就不会跟着快指针进行挪动,直到找到下一个可以更新的元素。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int q=0;
        for(int p=0;p<nums.size();p++){
            if(nums[p]!=val){
                nums[q++]=nums[p];
            }
        }
        return q;
    
    }
};

 这道题几个月前做过一次,但是已经完全忘记双指针这个做法了,看完代码随想录中的动图后,又在草稿纸上演练了几回。因为想着把两个指针的挪动都包在一个个i的for循环里,,所以在p和q++放的位置这里思考了很久,是先挪呢还是先判断呢,是把q++放到判断里呢还是判断外呢,好像总是想不出来一个满足所有特殊情况的做法。

直到看到代码随想录的代码,豁然开朗。原来可以直接把p放进for循环,以p指针没有遇到需要移除的元素为条件,来对q进行更改。这样,也就不用管p远离q很远了,反正遇到不移除的q更新就好了。

感想

昨天旅游回来发现今天正好有一期开营,所以很巧地赶上了这一期。希望接下来两个月能完成代码随想录一刷~

加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值