⭐算法入门⭐《线性枚举》简单03 —— LeetCode 26. 删除有序数组中的重复项

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

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

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

数据结构难?不存在的!
数据结构入门

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

文章目录

  • 一、题目
    • 1、题目描述
    • 2、基础框架
    • 3、原题链接
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、本题小知识

一、题目

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类型的引用,要求在这个数组基础上进行修改,不能引入其它数组。

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 。

三、本题小知识

当数组有序时,相等的元素一定出现在连续的一段区间内。


你可能感兴趣的:(《LeetCode算法全集》,c++,算法,leetcode,数据结构,数组)