返回

用 C++ 轻松搞定 LeetCode-26:删除有序数组中的重复项

闲谈

删除有序数组中的重复项:如何用 C++ 解决 LeetCode-26

面对 LeetCode 众多难题,相信各位程序员都曾为一道题目而绞尽脑汁,那就是 LeetCode-26。LeetCode-26 要求我们删除有序数组中的重复项,并将修改后的数组返回。看起来很简单,但其中的技巧却不容小觑。本文将从 C++ 的角度出发,提供一种简洁高效的解决方法,帮助大家轻松应对 LeetCode-26。

算法思想

我们知道,有序数组的特点是元素从小到大排列。因此,我们可以使用双指针法来遍历数组,并不断更新结果数组。具体步骤如下:

  1. 初始化两个指针 slowfast,其中 slow 指向结果数组的当前位置,fast 指向待检查元素。
  2. 移动 fast 指针,直到找到一个与 nums[slow] 不同的元素。
  3. 如果 fast 指针找到了一个不同的元素,则将 nums[fast] 赋值给 nums[slow+1],并移动 slow 指针。
  4. 重复步骤 2-3,直到 fast 指针遍历完整个数组。
  5. 返回结果数组 nums,其中 nums[0:slow] 为不包含重复元素的数组。

C++ 代码实现

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.empty()) {
            return 0;
        }
        
        int slow = 0;
        for (int fast = 1; fast < nums.size(); fast++) {
            if (nums[fast] != nums[slow]) {
                nums[++slow] = nums[fast];
            }
        }
        
        return slow + 1;
    }
};

代码分析

这段 C++ 代码简洁明了,完美地体现了双指针法的精髓。

  1. 首先判断数组是否为空,如果为空直接返回 0。
  2. 使用 slowfast 两个指针,初始时 slow 指向数组的第一个元素,fast 指向第二个元素。
  3. 进入循环,fast 指针不断向后遍历数组,直到找到一个与 nums[slow] 不同的元素。
  4. 如果找到不同的元素,则将该元素赋值给 nums[slow+1],并将 slow 指针右移一位。
  5. 重复步骤 3-4,直到 fast 指针遍历完整个数组。
  6. 最后返回 slow + 1,表示不包含重复元素的数组的长度。

运行结果

对于输入 [1,1,2,2,3,3,4,4,5,5],该算法将返回 [1,2,3,4,5]

总结

使用双指针法,我们可以高效地解决 LeetCode-26 问题,删除有序数组中的重复项。C++ 代码实现简洁优雅,只需短短几行代码就能完成任务。希望本文对大家有所帮助,祝各位在 LeetCode 的征程中披荆斩棘,百战不殆。