力扣面试经典算法150题:删除有序数组中的重复项 II

删除有序数组中的重复项 II

今天的题目是力扣面试经典150题中的数组的中等难度题: 删除有序数组中的重复项 II

题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envType=study-plan-v2&envId=top-interview-150

题目描述

给定一个排序好的数组 nums,请原地删除重复出现的元素,使得每个元素最多出现两次,并返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

  • 示例:
    • 输入:
      nums = [1,1,1,2,2,3]
    • 输出:
      [1,1,2,2,3], 新长度为 5
    • 输入:
      nums = [0,0,1,1,1,1,2,3,3]
    • 输出:
      [0,0,1,1,2,3,3], 新长度为 7

题目分析

题目要求我们删除一个已排序数组中的重复元素,使得每个元素最多出现两次。我们需要在原地修改数组,并且只能使用常数级别的额外空间。

重点注意的地方是已排序的数组,因为已排序的数组,有需要原数组操作比较,我们可以优先考虑一下双指针法进行求解。在移出重复元素的简单难度中也分析过。只不过我们需要考虑得到是之前移出到只有一个元素,现在保留两个,那么我们指针的间距和起始位置也要修改。

解题思路

直接考虑双指针法,需要注意的就是两个指针的作用及起始位置。

双指针法:

  1. 特殊情况长度不足的直接返回。
  2. 定义一个慢指针,用于去重后的数组指针,指针大小为2,因为作为有序数组,前两个元素可以直接放入到结果数组中。
  3. 定义一个快指针,对数组进行循环,并且从索引2开始进行,因为有序数组,前两个一定是符合要求的元素。
  4. 当前数组的元素(快指针)与结果数组(慢指针)下标前两个位置的元素进行比较。如果值不相同,说明这个元素需要放到结果数组中去,同时因为放入结果数组,慢指针的值需要加1。如果相等跳过无需处理。

最后输出慢指针的值,就是结果数组的长度。

实际算法代码

下面是通过以上分析使用双指针法的 Java 实现:

java 复制代码
public class RemoveDuplicatesII {

    public static void main(String[] args) {
        RemoveDuplicatesII solution = new RemoveDuplicatesII();

        // 示例数据
        int[] nums = {1, 1, 1, 2, 2, 3};

        // 调用删除重复项的方法
        int newLength = solution.removeDuplicatesFastSlow(nums);

        // 输出结果
        System.out.println("New length : " + newLength);
    }

    /**
     * 删除有序数组中的重复项 II:双指针法(快慢指针)
     *
     * @param nums 排序好的数组
     * @return 删除重复项后的数组新长度
     */
    public int removeDuplicatesFastSlow(int[] nums) {
        if (nums.length <= 2) {
            return nums.length;
        }

        int slow = 2;

        for (int fast = 2; fast < nums.length; fast++) {
            if (nums[fast] != nums[slow - 2]) {
                nums[slow] = nums[fast];
                slow++;
            }
        }

        return slow;
    }
}

结果

执行函数,测试通过:

提交到力扣,测试也通过:

总结

在对有序数组的问题解决中,双指针法是非常实用的。目前为止已经用了好几次了。所以熟练掌握双指针法,对于数组方面的算法问题的解决会有很大帮助。

中等难度第一题,搞定!!!

感觉还行,加油!!!

相关推荐
drebander5 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
乌啼霜满天2498 分钟前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn14 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
莫叫石榴姐14 分钟前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
程序猿阿伟14 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy24 分钟前
高级编程之结构化代码
java·spring boot·spring cloud
弗锐土豆31 分钟前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部
Elaine20239132 分钟前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
小小大侠客1 小时前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext
一二小选手1 小时前
【MyBatis】全局配置文件—mybatis.xml 创建xml模板
xml·java·mybatis