leetcode 面试经典 150 题:删除有序数组中的重复项

链接 删除有序数组中的重复项
题序号 26
题型 数组
解题方法 双指针
难度 简单
熟练度 ✅✅✅✅✅

题目

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。

返回 k 。

  • 判题标准:

    系统会用下面的代码来测试你的题解:

    int\[\] nums = ...; // 输入数组

    int\[\] expectedNums = ...; // 长度正确的期望答案

    int k = removeDuplicates(nums); // 调用

    assert k == expectedNums.length;

    for (int i = 0; i < k; i++) {

    assert numsi == expectedNumsi;

    }

    如果所有断言都通过,那么您的题解将被 通过。

  • 示例 1:

    输入:nums = 1,1,2

    输出:2, nums = 1,2,_

    解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

  • 示例 2:

    输入:nums = 0,0,1,1,1,2,2,3,3,4

    输出:5, nums = 0,1,2,3,4

    解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

  • 提示:

    1 <= nums.length <= 3 * 104

    -104 <= numsi <= 104

    nums 已按 非严格递增 排列

题解

  1. 核心要点:快慢指针同时指向索引 1,前后不相同,快慢指针都向前走一步,前后相同,慢指针不走快指针走一步;
  2. 时间复杂度:O(n)
  3. 空间复杂度:O(1)
  4. c++ 实现算法
cpp 复制代码
class Solution {
public:
    int removeDuplicates(vector<int>& nums)  {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int fast = 1, slow = 1;
        
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        nums.resize(slow);

        return slow;
    }
};
  1. 演示

    • 示例
      假设输入数组 nums = 1, 1, 2, 3, 3, 4, 5
    • 遍历过程
      初始化时,fast = 1, slow = 1。
      numsfast = 1,与 numsfast - 1 = 1 相等,跳过。
      fast = 2,numsfast = 2,与 numsfast - 1 = 1 不相等,放到 numsslow,numsslow = 2,slow++,slow = 2。
      fast = 3,numsfast = 3,与 numsfast - 1 = 2 不相等,放到 numsslow,numsslow = 3,slow++,slow = 3。
      fast = 4,numsfast = 3,与 numsfast - 1 = 3 相等,跳过。
      fast = 5,numsfast = 4,与 numsfast - 1 = 3 不相等,放到 numsslow,numsslow = 4,slow++,slow = 4。
      fast = 6,numsfast = 5,与 numsfast - 1 = 4 不相等,放到 numsslow,numsslow = 5,slow++,slow = 5。
    • 最终,slow = 5,数组 nums 被调整为 1, 2, 3, 4, 5,返回值为 5。
  2. c++ 完整 demo

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int removeDuplicates(vector<int>& nums)  {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int fast = 1, slow = 1;
        
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        nums.resize(slow);

        return slow;
    }
};

int main() {
    vector <int> nums = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4}; //数组必须是非严格递增,该算法才有效,若是无序数组,可以先排序sort下再移除。
    Solution solution;
    int number =  solution.removeDuplicates(nums);

    cout << "number: " << number << endl;
    cout << "nums.size: " << nums.size() << endl;

    for(int i = 0; i < nums.size(); i++){
        cout << "i: " << i << "; nums[" << i << "]: " << nums[i] << endl;

    }
  return 0;
}
相关推荐
无限码力4 分钟前
美团研发岗 4月18号笔试真题 - 包包的最长公共子序列3
算法·美团笔试题·美团研发岗笔试题·美团机试题
怪兽学LLM19 分钟前
LeetCode 21 合并两个有序链表:彻底理解虚拟头节点(Dummy)套路
python·leetcode·链表
阿里matlab建模师21 分钟前
基于matlab时域频域处理的语音信号变声处理系统设计与算法原理(论文+程序源码+GUI图形用户界面)——变声算法
算法·matlab·语音识别
IMPYLH24 分钟前
HTML 的 <abbr> 元素
前端·算法·html
leo__52033 分钟前
小波特征与模糊支持向量机(FSVM)的脑电信号分类方法
算法·支持向量机·分类
wabs66638 分钟前
关于动态规划【纯粹的0-1背包需要思考的问题】
算法·动态规划
小小编程路39 分钟前
字符串转数字时,可能会遇到哪些问题?
java·开发语言·算法
rit84324991 小时前
MATLAB近红外光谱预处理:平滑与求导(MSV方法)
数据结构·算法·matlab
蚂蚁数据AntData1 小时前
从ChatBI到业务记忆:重新定义数据智能的生产力边界
大数据·网络·数据库·人工智能·算法
_日拱一卒1 小时前
LeetCode:22括号生成
算法·leetcode·职场和发展