leetcode笔记总结——(4)删除有序数组中的重复项(python和C++实现)
发布日期:2021-05-15 00:34:12 浏览次数:26 分类:精选文章

本文共 1249 字,大约阅读时间需要 4 分钟。

题目描述

给定一个有序数组,其中每个元素可以重复多次,但要确保相同的元素最多只能连续出现两次。本题要求通过双指针方法高效地解决这个问题。

思路

由于数组是有序的,相同的元素必然是连续的。因此,我们可以利用双指针的方法来遍历数组,检查每个元素是否需要被保留。如果不需要被保留,则跳过当前元素;如果需要被保留,则将当前元素移动到指定位置。

具体步骤如下:

  • 初始化两个指针 slowfast,分别用于记录处理后的数组长度和当前位置。
  • slowfast 初始化为 2,因为前两个元素必然可以保留。
  • 遍历数组,使用 fast 指针逐步检查每个元素。
  • 当且仅当当前元素与上一个应该保留的元素相同时,当前元素不应该被保留(因为此时可能存在三个连续的相同元素)。
  • 使用 slow 进行位置调整,最终返回 slow 即为处理后的数组长度。
  • 代码实现

    Python 实现

    class Solution:
    def removeDuplicates(self, nums: list) -> int:
    n = len(nums)
    if n <= 2:
    return n
    slow = fast = 2
    while fast < n:
    if nums[slow - 2] != nums[fast]:
    nums[slow] = nums[fast]
    slow += 1
    fast += 1
    return slow

    C++ 实现

    class Solution {
    public:
    int removeDuplicates(std::vector
    nums) {
    int n = nums.size();
    if (n <= 2) {
    return n;
    }
    int slow = 2, fast = 2;
    while (fast < n) {
    if (nums[slow - 2] != nums[fast]) {
    nums[slow] = nums[fast];
    slow++;
    }
    fast++;
    }
    return slow;
    }
    };

    总结

    本题利用双指针法结合数组有序性,高效地解决了重复元素的问题。这种方法的核心思想是遍历数组,确保每个元素最多保留两次。对于长度不超过 2 的数组,无需任何处理。这种方法时间复杂度为 O(n),空间复杂度为 O(1),具有较高的效率。

    上一篇:C++学习笔记——(4)基于多态的 职工管理系统
    下一篇:C++学习笔记——(3)C++核心编程(类和对象)

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月13日 01时11分35秒