⭐算法入门⭐《线性枚举》中等03 —— LeetCode 27. 移除元素
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《线性枚举》中等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、原题链接
二、解题报告
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) 进行删除。
以上是关于⭐算法入门⭐《线性枚举》中等03 —— LeetCode 27. 移除元素的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《线性枚举》中等02 —— LeetCode 628. 三个数的最大乘积
⭐算法入门⭐《二分枚举》中等03 —— LeetCode 1539. 第 k 个缺失的正整数
⭐算法入门⭐《线性枚举》简单03 —— LeetCode 26. 删除有序数组中的重复项
⭐算法入门⭐《二分枚举》中等01 —— LeetCode 面试题 16.21. 交换和