80. 删除排序数组中的重复项 II

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 80. 删除排序数组中的重复项 II

本题来自 LeetCode:80. 删除排序数组中的重复项 II[1]

题目描述

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


给定 nums = [1,1,1,2,2,3],
函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
你不需要考虑数组中超出新长度后面的元素。

示例  2:


给定 nums = [0,0,1,1,1,1,2,3,3],
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
你不需要考虑数组中超出新长度后面的元素。

说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:


// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i  len; i++) {
    print(nums[i]);
}

题目分析

26. 删除排序数组中的重复项类似,采用双指针,一个慢指针(记录当前排序好的数组元素的个数),一个快指针(用来遍历整个数组),增加一个计数器(用于记录排序好的数组的最后一个元素出现的次数)。用快指针位置的值和当前排序好的、无重复元素数组的 最后一个值比较,若不相等,则将该元素加入到前面的数组中,并将 当前计数置为 1。若相等,则需要判断当前元素是否已经加入两次到左边的数组中了:若是:则跳过;若不是:加入到左边的数组中。

题目解答


class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums == null || nums.length == 0) {
            return 0;
        }
        int count = 1;
        int currentCount = 1;
        for(int i = 1; i  nums.length; i ++) {
            if(nums[i] != nums[count - 1]) {
                nums[count ++] = nums[i];
                currentCount = 1;
            } else {
                if(currentCount  2) {
                    nums[count ++] = nums[i];
                }
                currentCount ++;
            }
        }
        return count;
    }
}

复杂度分析:
时间复杂度: O(n)
空间复杂度: O(1)

参考资料

  1. 删除排序数组中的重复项 II: https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii

原文始发于微信公众号(xiaogan的技术博客):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 80. 删除排序数组中的重复项 II


 上一篇
Java反射的那些事(1)- 泛型和类型 Java反射的那些事(1)- 泛型和类型
最近在做一个 Map数据结构转换为指定 Class类型的工具,涉及了反射相关的知识点。借这个机会,整理下这方面的知识。这篇文章先来了解下泛型和Type类型的知识点。  Java JDK从1.5开始引入泛型这个概念,在这之前只有原始类型而没有
2021-04-05
下一篇 
203. 移除链表元素 203. 移除链表元素
本题来自 LeetCode:203. 移除链表元素[1] 题目描述删除链表中等于给定值 val 的所有节点。示例: 输入: 1-2-6-3-4-5-6, val = 6 输出: 1-2-3-4-5 题目分析采用单指针遍历链表,判断下一个
2021-04-05