【leetcode】27.移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

  • 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
  • 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
  • 示例 1:
  • 给定 nums = [3,2,2,3], val = 3,
  • 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
  • 你不需要考虑数组中超出新长度后面的元素。

1.拷贝覆盖

主要思路:定义一个变量,对不重复的值计数。for循环完成。

存在的问题 就是值可以计算出当前不相同值,数组的值是不符合要求的。

这种思路在移除元素较多时更适合使用,最极端的情况是全部元素都需要移除,遍历一遍结束即可

时间复杂度:O(n) 空间复杂度O(1)

public static int removeElement3(int [] nums,int val){
        int count = 0;
        for (int num:nums) {
            if (num!=val){
                nums[count++] = num;
            }
        }
        return count;
    }

2.交换移除

主要思路:用一个变量去记录数组的长度,然后处理两种情况,一种是当前的值等于val 就将数组中最后的值赋值给当前相同的值,m 用来不断减少数组的长度。否则的话 是另一种情况 如果不相等 直接i++ 判断下一个就可以。

这种思路在移除元素较少时更适合使用,最极端的情况是没有元素需要移除,遍历一遍结束即可

时间复杂度:O(n),空间复杂度:O(1)

public static int removeElement4(int [] nums,int val){
        int m = nums.length;
        for (int i = 0; i < m; ) {//注意for 这里不能i++ i是用来确认哪些数据不是要寻找的
            if (nums[i] == val){
                nums[i] = nums[m-1];
                m--;
            }else {
                i++;
            }
        }
        return m;
    }

3.双指针

实现思路:一个快指针 一个慢指针。用快指针来判断是否相等 不相等赋值给慢指针,慢指针的作用是来定位前面如果有重复的直接跳过去。

时间复杂度:o(n)

空间复杂度:o(1)

public static int removeElement5(int [] nums,int val){
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            if (nums[j]!=val){
                nums[i] = nums[j];
                i++;//加1
            }
            //如果相等 不做 等待下标i来进行覆盖
        }
        return i;
    }

4.双指针 —当要删除的元素很少时

实现思路:通过快慢指针 在一种比较极端的情况下。nums[1,2,3,5,4] val = 4 在最后才可以找到需要删除的元素,虽然nums中的值没有改变,但是通过m-- 停止了循环 i=4。

当我们遇到 nums[i] = valnums[i]=val 时,我们可以将当前元素与最后一个元素进行交换,并释放最后一个元素。这实际上使数组的大小减少了 1。

时间复杂度:O(n)

空间复杂度:O(1)

public static int removeElement6(int [] nums,int val){
        int i = 0;
        int m = nums.length;
        while (i<m){
            if (nums[i] == val){//相当的话 直接将快指针元素赋值给慢指针
                nums[i] = nums[m-1];
                m--;
            }else {
                i++;//不相等 直接跳过
            }
        }
        return i++;
    }
全部评论

相关推荐

哞客37422655...:你猜为什么福利这么好还得一直追着你问
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务