⭐算法入门⭐《线性枚举》简单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 。

三、本题小知识

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

英雄哪里出来

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

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

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

打赏作者

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

抵扣说明:

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

余额充值