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;
}
相关推荐
先做个垃圾出来………27 分钟前
哈夫曼树(Huffman Tree)
数据结构·算法
phoenix@Capricornus2 小时前
反向传播算法——矩阵形式递推公式——ReLU传递函数
算法·机器学习·矩阵
Inverse1622 小时前
C语言_动态内存管理
c语言·数据结构·算法
数据与人工智能律师2 小时前
虚拟主播肖像权保护,数字时代的法律博弈
大数据·网络·人工智能·算法·区块链
wuqingshun3141593 小时前
蓝桥杯 16. 外卖店优先级
c++·算法·职场和发展·蓝桥杯·深度优先
YouQian7724 小时前
2025春训第十九场
算法
CodeJourney.4 小时前
基于MATLAB的生物量数据拟合模型研究
人工智能·爬虫·算法·matlab·信息可视化
Epiphany.5564 小时前
素数筛(欧拉筛算法)
c++·算法·图论
爱吃涮毛肚的肥肥(暂时吃不了版)4 小时前
项目班——0510——JSON网络封装
c++·算法·json
liang_20264 小时前
【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
数据结构·笔记·学习·算法·平面·总结