Cover image for 面试经典150题 P26 删除有序数组中的重复项

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


时间轴

时间轴

2025-09-28

init

std::unique

题目:

std::unique 是 C++ 里的函数,它并不会真正删除容器里的元素,而是 将相邻的重复元素“移到后面”,并返回一个指向“新的逻辑末尾”的迭代器。配合 erase 可以实现删除重复元素。

1234567891011
#include <algorithm>#include <vector>using std::vector;class Solution {public:    int removeDuplicates(vector<int>& nums) {        nums.erase(std::unique(nums.begin(),nums.end()),nums.end());        return nums.size();    }};

经典快慢指针解法:快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 1。

123456789101112131415161718
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;        }        return slow;    }};