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 nums[i] == expectedNums[i];

    }

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

  • 示例 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 <= nums[i] <= 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。
      nums[fast] = 1,与 nums[fast - 1] = 1 相等,跳过。
      fast = 2,nums[fast] = 2,与 nums[fast - 1] = 1 不相等,放到 nums[slow],nums[slow] = 2,slow++,slow = 2。
      fast = 3,nums[fast] = 3,与 nums[fast - 1] = 2 不相等,放到 nums[slow],nums[slow] = 3,slow++,slow = 3。
      fast = 4,nums[fast] = 3,与 nums[fast - 1] = 3 相等,跳过。
      fast = 5,nums[fast] = 4,与 nums[fast - 1] = 3 不相等,放到 nums[slow],nums[slow] = 4,slow++,slow = 4。
      fast = 6,nums[fast] = 5,与 nums[fast - 1] = 4 不相等,放到 nums[slow],nums[slow] = 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;
}
相关推荐
CoderYanger1 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
厕所博士1 小时前
红黑树原理前置理解—— 2-3 树
算法·2-3树·红黑树原理理解前置
初辰ge1 小时前
2025年12月高质量简历模板平台深度解析
面试
萌>__<新2 小时前
力扣打卡每日一题————除自身外所有元素的乘积
数据结构·算法
xu_yule2 小时前
算法基础—搜索(2)【记忆化搜索+BFS+01BFS+Floodfill]
数据结构·算法
s09071362 小时前
Xilinx FPGA使用 FIR IP 核做匹配滤波时如何减少DSP使用量
算法·fpga开发·xilinx·ip core·fir滤波
老马啸西风2 小时前
成熟企业级技术平台-10-跳板机 / 堡垒机(Bastion Host)详解
人工智能·深度学习·算法·职场和发展
子夜江寒2 小时前
逻辑回归简介
算法·机器学习·逻辑回归
软件算法开发3 小时前
基于ACO蚁群优化算法的多车辆含时间窗VRPTW问题求解matlab仿真
算法·matlab·aco·vrptw·蚁群优化·多车辆·时间窗
another heaven3 小时前
【软考 磁盘磁道访问时间】总容量等相关案例题型
linux·网络·算法·磁盘·磁道