⭐算法入门⭐《线性枚举》简单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、原题链接

LeetCode 26. 删除有序数组中的重复项

二、解题报告

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. 加一

⭐算法入门⭐《线性枚举》简单07 —— LeetCode 414. 第三大的数

⭐算法入门⭐《线性枚举》简单05 —— LeetCode 485. 最大连续 1 的个数