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;
}
相关推荐
苦瓜小生1 小时前
AI名词大扫盲!最全的面试ai名词集合
人工智能·面试
KaMeidebaby1 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao1 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode
龙虾PRO1 小时前
能源与股票量化核心差异,AI全链路落地实操手册
java·面试·职场和发展
uzong2 小时前
把一面面试总结做成一个 Skill:重复的事,就别每次都重写
后端·面试
圣保罗的大教堂2 小时前
leetcode 3514. 不同 XOR 三元组的数目 II 中等
leetcode
wdfk_prog5 小时前
嵌入式面试真题第 12 题:资源受限长期运行系统的确定性内存管理与内存池架构设计
考研·面试·职场和发展
青山木5 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务5 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报5 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法