代码随想录阅读总结:移除元素

移除元素

题目在链接中,这只是一个学习总结不能喧宾夺主。

推荐先看代码随想录的题目和题解,然后看看我的总结,我会尽量用通俗的简单词描述我的思路——其实是我会的高级词不多。

力扣

代码随想录

思路

读完题一脸懵,什么叫原地呀?

  • 原地指的是不用再定义一个数组进行赋值。
  • 仅在原数组中用一个循环遍历原数组进行修改。

那么我们可以考虑两种方法

  • 暴力
  • 双指针

暴力法

代码如下:

class Solution {
public:
    int removeElement(vector<int>& nums, int val){
        int size = nums.size();
        for (int i=0;i<size;i++){//注意这里的i<size是很关键的,size不断更新,防止访问超过新长度的值,而这个值可能等于目标值,从而导致错误。
            if(nums[i]==val){
                for(int j=i+1;j<size;j++){
                    nums[j-1] = nums[j];
                }
                i--;//这里是因为内循环会把nums[i]更新为下一个值,我们需要重新访问nums[i];
                size--;//每有一个目标值,就要更新长度。
            }
        }
        return size;
    }
};

双指针法

双指针法一般指快慢指针法,由一个慢指针和一个快指针再一个循环内完成两个循环的工作。

快慢指针的定义

  • 快指针: 正常循环更新。
  • 慢指针: 在找到目标值时不更新,其余情况更新。

代码如下:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowIndex = 0;//慢指针同时用于记录新长度,一石二鸟。
        for(int fastIndex=0;fastIndex<nums.size();fastIndex++){
            if(val != nums[fastIndex]){
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
};

能力有限,如有问题还望指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值