LeetCode第80题删除有序数组中的重复项 II

继续打卡算法题,今天学习的是LeetCode第80题删除有序数组中的重复项 II,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。

分析一波题目

本题要求原地处理原数组,删除重复项,并且只能使用O(1)的额外空间。

由于是有序的,我们只要把未超过2个重复的数字记录下来就可以了。

怎么记录呢,使用一个slow下标表示需要记录的数字,一个fast下标用于循环原数组,一个pre字段记录前一个数字,一个字段count对某个数字计数。这就是双指针的做法。

循环原数组,依次按上图规律,把需要保留的数保留下来,最终slow指针指向最后一个数字的后一位,也就是保留下来的数的长度。

本题解题技巧

1、使用双指针,慢指针记录需要保留下来的下标,快指针遍历原数组。

编码解决

java 复制代码
class Solution {
    public int removeDuplicates(int[] nums) {

        int slow = 1;
        int pre = nums[0];
        int count = 1;
        for (int fast=1; fast<nums.length; fast++) {
            if (pre == nums[fast]) {
                count++;
                if (count <=2) {
                    nums[slow] = nums[fast];
                } else {
                //相同的元素超过2个,跳过
                    continue;
                }
            } else {
                 pre = nums[fast];
                 count = 1;
                 nums[slow] = nums[fast];
            }
            slow++;
        }
        return slow;
    }
}

总结

1、双指针处理一维数组很有用,特别是有序的数组,可以提高遍历的效率。

相关推荐
canonical_entropy2 分钟前
最小变更成本 vs 最小信息表达:第一性原理的比较
后端
渣哥3 分钟前
代理选错,性能和功能全翻车!Spring AOP 的默认技术别再搞混
javascript·后端·面试
如竟没有火炬18 分钟前
全排列——交换的思想
开发语言·数据结构·python·算法·leetcode·深度优先
间彧19 分钟前
Java泛型详解与项目实战
后端
间彧29 分钟前
PECS原则在Java集合框架中的具体实现有哪些?举例说明
后端
间彧31 分钟前
Java 泛型擦除详解和项目实战
后端
寂静山林31 分钟前
UVa 12526 Cellphone Typing
算法
-睡到自然醒~33 分钟前
[go 面试] 前端请求到后端API的中间件流程解析
前端·中间件·面试
间彧34 分钟前
在自定义泛型类时,如何正确应用PECS原则来设计API?
后端
间彧35 分钟前
能否详细解释PECS原则及其在项目中的实际应用场景?
后端