⭐算法入门⭐《线性枚举》简单03 —— LeetCode 26. 删除有序数组中的重复项
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《线性枚举》简单03 —— LeetCode 26. 删除有序数组中的重复项相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
还不会C语言,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?上简单题! 🧡《C语言入门100例》🧡
LeetCode 太简单?大神盘他! 🌌《夜深人静写算法》🌌
一、题目
1、题目描述
给出一个有序数组 n u m s nums nums ,请 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间。
样例输入: n u m s = [ 0 , 0 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 4 ] nums = [0,0,1,1,1,2,2,3,3,4] nums=[0,0,1,1,1,2,2,3,3,4]
样例输出: 5 , n u m s = [ 0 , 1 , 2 , 3 , 4 ] 5, nums = [0,1,2,3,4] 5,nums=[0,1,2,3,4]。
2、基础框架
- c++ 版本给出的基础框架代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
}
};
- 传参是一个
vector<int>
类型的引用,要求在这个数组基础上进行修改,不能引入其它数组。
3、原题链接
二、解题报告
1、思路分析
由于数组是有序的,所以大小相等的数一定出现在连续的一段区间。所以,核心是比较,如果相等则舍弃,不相等就放入候选数组。由于我们做的是删除操作,所以候选数组的长度在任何时候一定小于原数组,所以候选数组可以和原数组是同一块内存空间。
2、时间复杂度
- 线性枚举时间复杂度为 O ( n ) O(n) O(n)。
3、代码详解
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int nowIdx = 0; // (1)
if(nums.size() == 0) {
return 0;
}
for(int i = 1; i < nums.size(); ++i) { // (2)
if(nums[i] != nums[nowIdx]) {
nums[++nowIdx] = nums[i];
}
}
return nowIdx + 1; // (3)
}
};
-
(
1
)
(1)
(1)
nowIdx
记录的是 有序不重复数组 最后一个元素的下标; - ( 2 ) (2) (2) 从第 1 个元素开始枚举,将 当前元素 和 有序不重复数组最后一个元素 进行比较,如果不相等,则 将 当前元素 放到 有序不重复数组最后一个元素 后面,更新下标;
- ( 3 ) (3) (3) 由于数组下标从 0 开始,所以返回长度时需要 +1 。
三、本题小知识
当数组有序时,相等的元素一定出现在连续的一段区间内。
以上是关于⭐算法入门⭐《线性枚举》简单03 —— LeetCode 26. 删除有序数组中的重复项的主要内容,如果未能解决你的问题,请参考以下文章
算法入门 01线性枚举(简单 - 第三题)LeetCode 876
算法入门 01线性枚举(简单 - 第二题)LeetCode 557
算法入门 01线性枚举(简单 - 第一题)LeetCode 344
⭐算法入门⭐《线性枚举》简单09 —— LeetCode 66. 加一