⭐算法入门⭐《线性枚举》中等03 —— LeetCode 27. 移除元素

🙉饭不食,水不饮,题必须刷🙉

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

LeetCode 太难?先看简单题!
🧡《C语言入门100例》🧡

数据结构难?不存在的!
🌳《画解数据结构》🌳

闭关刷 LeetCode,剑指大厂Offer!
🌌《LeetCode 刷题指引》🌌

LeetCode 太简单?算法学起来!
💜《夜深人静写算法》💜

一、题目

1、题目描述

  给你一个数组 n u m s nums nums 和一个值 v a l val val,你需要 原地 移除所有数值等于 v a l val val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O ( 1 ) O(1) O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
  样例输入: nums = [0,1,2,2,3,0,4,2], val = 2
  样例输出: 5, nums = [0,1,4,0,3]

2、基础框架

  • C语言 版本给出的基础框架代码如下:
int removeElement(int* nums, int numsSize, int val){
}

3、原题链接

LeetCode 27. 移除元素

二、解题报告

1、思路分析

  思路比较简单,遍历整个数组,如果遇到和给定数字一样的,就将它和数组最后一个元素交换,然后数组元素个数减一。然后指针回退1,继续做一样的事情,直到没有和给定元素相等的数为止。

2、时间复杂度

  • 删除元素不涉及元素前移,所以总的时间复杂度为 O ( n ) O(n) O(n)

3、代码详解

int swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
    return tmp;
}

int removeElement(int* nums, int numsSize, int val){
    int i;
    for(i = 0; i < numsSize; ++i) {
        while(nums[i] == val) {                     // (1) 
            swap(&nums[i], &nums[numsSize-1]);      // (2) 
            --numsSize;                             // (3) 
            if(i >= numsSize) {                     // (4) 
                break;
            }
        }
    }
    return numsSize;
}
  • ( 1 ) (1) (1) 注意这里是 while,而不是 if;
  • ( 2 ) (2) (2) 如果发现这个数是需要删除的,则和最后一个数交换 ;
  • ( 3 ) (3) (3) 最后那个数直接弹出不管了;
  • ( 4 ) (4) (4) 没有多余元素时,直接跳出循环。

三、本题小知识

数组元素删除,如果对顺序要求不高,可以利用以上方法 O ( 1 ) O(1) O(1) 进行删除。


  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值