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

相关推荐
山烛10 分钟前
KNN 算法中的各种距离:从原理到应用
人工智能·python·算法·机器学习·knn·k近邻算法·距离公式
guozhetao22 分钟前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论
前端小巷子23 分钟前
Webpack 5模块联邦
前端·javascript·面试
前端双越老师24 分钟前
为何前端圈现在不关注源码了?
面试·前端框架·源码
吃着火锅x唱着歌25 分钟前
LeetCode 611.有效三角形的个数
算法·leetcode·职场和发展
江城开朗的豌豆33 分钟前
Vue和React中的key:为什么列表渲染必须加这玩意儿?
前端·vue.js·面试
小鱼人爱编程1 小时前
Java基石--反射让你直捣黄龙
前端·spring boot·后端
hqxstudying1 小时前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
GM_8281 小时前
【最新最完整】SpringAI-1.0.0开发MCP Server,搭建MCP Client 实战笔记(进阶+详细+完整代码)
java·后端·ai编程·springai·mcp
程序员爱钓鱼1 小时前
Go语言实战案例-滑动窗口最大值
后端·google·go