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;
}
相关推荐
空奈qwq10 分钟前
ANN 全连接神经网络入门指南:从神经元到深度学习的第一步
人工智能·python·深度学习·神经网络·算法·机器学习
hetao173383727 分钟前
2026-09-27~28 hetao1733837 的刷题记录
c++·算法
Godspeed Zhao35 分钟前
现代智能雷达技术15——算法(1)
人工智能·算法·雷达
代码什么用38 分钟前
LeetCode-42. 接雨水
算法·leetcode
lengxuenong42 分钟前
枚举及其优化学习手册
c++·学习·算法·青少年编程
小O的算法实验室1 小时前
IEEE TAI,RoCo:基于角色的LLM协作实现自动启发式设计
算法
小范的技术工坊1 小时前
大模型蒸馏
人工智能·算法·数据挖掘·大模型
Benny_Tang1 小时前
P9527 [JOIST 2022] 洒水器 / Sprinkler 题解
c++·算法
kiracrimson1 小时前
希尔排序:让插入排序不再怕逆序
数据结构·算法·排序算法
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出星球探险中的“独特能量石“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质