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

简介: 文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。

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

image.png

分析一波题目

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

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

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

image.png

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

本题解题技巧

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

编码解决

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、双指针处理一维数组很有用,特别是有序的数组,可以提高遍历的效率。

相关文章
|
2月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
38 2
|
4月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
23 4
|
2月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
43 0
|
4月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
4月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
4月前
|
Python
【Leetcode刷题Python】108. 将有序数组转换为二叉搜索树
LeetCode上108号问题"将有序数组转换为二叉搜索树"的Python实现,通过递归选取数组中间值作为根节点,构建高度平衡的二叉搜索树。
28 2
|
4月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
56 0
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
48 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行