首页 > 其他分享 >【leetcode-面试经典 150 题】-4.删除有序数组中的重复项 II

【leetcode-面试经典 150 题】-4.删除有序数组中的重复项 II

时间:2024-10-24 19:17:28浏览次数:8  
标签:150 nums int 元素 保留 II 数组 长度 leetcode

题目:

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

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

示例 2:

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

分析:这题依然可以使用双指针,但是我并没有想到双指针的做法,只能瞻仰一下大佬了。想到一个相对好理解的方法,计算+ 指针。首先当数组内的元素小于等于2时,直接返回数组的长度。

将j设为新数组的下标,过程如下图所示,其中计数的逻辑就是,当前后相等时,count就++,当遇到第一个不相等的元素时,说明开始了下一个元素,于是将count重设为1,以便为下一个元素计数,而循环中的另一个判断则是保证该元素的重复数量始终在两个以内。

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;// 获取数组的长度
        // 如果数组长度小于等于2,直接返回长度,因为每个元素最多允许出现两次
        if (n<= 2){
            return n;
        }
        int j = 1;// 慢指针,指向新数组的下一个写入位置,初始化为1(第二个元素)
        count = 1;// 计数器,用于记录当前元素的出现次数,初始化为1
         // 快指针从索引1开始遍历数组
        for (int i = 1;i<n;i++){
            if (nums[i]==nums[i-1]){
                // 当前元素与前一个元素相同,增加计数
                count++;
            }else{
                count = 1;
            }
            // 如果当前元素的出现次数小于等于2
            if (count<=2){
                nums[j] = nums[i];// 将当前元素写入慢指针的位置
                j++;// 移动慢指针到下一个位置
            }
            // 如果出现次数超过2,则跳过当前元素,不进行写入
        }
        // 返回新数组的长度
        return j;
    }
}

另一种解法从力扣上找的大佬的。

通用解法
为了让解法更具有一般性,我们将原问题的「保留 2 位」修改为「保留 k 位」。

对于此类问题,我们应该进行如下考虑:

由于是保留 k 个相同数字,对于前 k 个数字,我们可以直接保留
对于后面的任意数字,能够保留的前提是:与当前写入的位置前面的第 k 个元素进行比较,不相同则保留
举个例子,我们令 k=2,假设有如下样例

[1,1,1,1,1,1,2,2,2,2,2,2,3]

首先我们先让前 2 位直接保留,得到 1,1
对后面的每一位进行继续遍历,能够保留的前提是与当前位置的前面 k 个元素不同(答案中的第一个 1),因此我们会跳过剩余的 1,将第一个 2 追加,得到 1,1,2
继续这个过程,这时候是和答案中的第 2 个 1 进行对比,因此可以得到 1,1,2,2
这时候和答案中的第 1 个 2 比较,只有与其不同的元素能追加到答案,因此剩余的 2 被跳过,3 被追加到答案:1,1,2,2,3

参考:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/solutions/1/gong-shui-san-xie-guan-yu-shan-chu-you-x-glnq/

class Solution {
    public int removeDuplicates(int[] nums) {   
        return process(nums, 2);
    }
    int process(int[] nums, int k) {
        int u = 0; 
        for (int x : nums) {
            if (u < k || nums[u - k] != x) nums[u++] = x;
        }
        return u;
    }
}

标签:150,nums,int,元素,保留,II,数组,长度,leetcode
From: https://blog.csdn.net/qq_52062644/article/details/143212858

相关文章

  • 【leetcode-面试经典 150 题】-1.合并两个有序数组
    题目:给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 ......
  • LeetCode常用算法模板
    代码模板  1、DFS:适用于树和图的遍历、组合问题。2、BFS:适用于树和图的层次遍历、最短路径问题。3、二分查找:适用于有序数组的搜索问题。4、动态规划:适用于最优化问题、序列问题。5、贪心算法:适用于局部最优问题、调度问题。6、回溯算法:适用于组合、排列、子集问题。......
  • 150份Java计算机毕业设计项目推荐(源码+论文+PPT)
    2024最新Java项目选题推荐哈喽,大家好,大四的同学马上要开始做毕业设计了,大家做好准备了吗?博主给大家详细整理了150个Java项目选题推荐,有什么疑问可在评论区留言哦!需要链接请私信我哦!或者在评论区打出来!02:基于Java+springboot的报名系统03:基于Java+springboot的培训管理系统......
  • Modbus ASCII
    简介ModbusASCII使用ASCII字符集传递消息,方便阅读和调试。ModbusASCII相比于ModbusRTU,协议帧中添加了起始和结束,更换了校验算法。Modbus网络模型这张图比较简洁清晰。Modbus网络中,只有一个Master,Master可以向Slave发起请求并获取响应,Slave只能被动发送响应而不能主动请求。......
  • Leetcode每日一题:3175. 找到连续赢 K 场比赛的第一位玩家
    题意为给定一个数组,数组头两数比大小,大的放队首,小的放队尾,找到能够连续赢K次的数的编号。思路:如果一轮比较完了,没有赢K次的,那答案就是数组最大值。利用双指针,模拟一轮比较,计算每个数的胜利次数,注意,若起点不是0的话,意味着他和之前的数比较是胜出的,所以初始为1,否则初始为0;1clas......
  • [LeetCode] 951. Flip Equivalent Binary Trees
    ForabinarytreeT,wecandefineaflipoperationasfollows:chooseanynode,andswaptheleftandrightchildsubtrees.AbinarytreeXisflipequivalenttoabinarytreeYifandonlyifwecanmakeXequaltoYaftersomenumberofflipoperations......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作,......
  • leetcode-1661-每台机器的平均运行时间
    链接:1661.每台机器的进程平均运行时间-力扣(LeetCode)前提条件:表: Activity+----------------+---------+|ColumnName|Type|+----------------+---------+|machine_id|int||process_id|int||activity_type|enum||timest......
  • c++ 构成整天的下标对数目 leetcode
    目录一、leetcode3184.构成 整天 的下标对数目I1.问题描述 2.方法:暴力穷举二、leetcode3185.构成 整天 的下标对数目II1.问题描述2.方法:哈希表一、leetcode3184.构成 整天 的下标对数目I1.问题描述给你一个整数数组 hours,表示以 小时 为单位的时间,返......
  • leetcode-197-上升的温度
    链接:197.上升的温度-力扣(LeetCode)前提条件:表: Weather+---------------+---------+|ColumnName|Type|+---------------+---------+|id|int||recordDate|date||temperature|int|+---------------+---------+id是......