当前位置: 首页 > news >正文

力扣经典算法篇-4-删除有序数组中的重复项 II(中等)

题干:
给你一个有序数组 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。不需要考虑数组中超出新长度后面的元素。

提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列

解题:
本题是在上一题的基础上,允许出现的最大次数为2次。所以任然可以使用快慢指针法,不过当元素相同的时候需要进一步验证下使用的次数,如果小于2次依然可以交换,如果超过2次就不能交换了。

代码示例:
Java版本:

public int removeDuplicates(int[] nums) {
        if (nums.length<=2){
            return nums.length;
        }
        int low = 0;
        int fast = 1;
        int tempCount = 1;
        while (fast<nums.length){
            if (nums[low] != nums[fast]){               // 快慢指针元素不相等时,直接将快指针的数据添加到慢指针的下一个位置
                nums[low+1] = nums[fast];
                tempCount = 1;                        // 第一次添加计数为0
                low++;  
            } else if(tempCount == 1){            // 快慢指针元素相同,但是此时只有一个元素,可以继续添加
                nums[low+1] = nums[fast];
                tempCount++;                          // 之后的添加,次数要自增。
                low++;
            }
            fast++;
        }
        return low+1;                               // low为下标,所以需要+1
    }

C版本:

int removeDuplicates(int* nums, int numsSize) {
    if(numsSize<=2){      // 少于两个元素直接返回
        return numsSize;
    }
    int low = 0,fast = 1;
    int count = 1;
    while(fast<numsSize){
        if(nums[low]!=nums[fast]){     // 快慢指针元素不相等时,直接将快指针的数据添加到慢指针的下一个位置
            nums[low+1] = nums[fast];
            low++;
            count = 1;                // 第一次添加计数为0
        } else if(count ==1){       // 快慢指针元素相同,但是此时只有一个元素,可以继续添加
            nums[low+1] = nums[fast];
            low++;
            count++;                 // 之后的添加,次数要自增。
        }
        fast++;
    }
    return low+1;                     // low为下标,所以需要+1
}

逆风翻盘,Dare To Be!!!

相关文章:

  • Python-Django入手
  • git的clone报错unable to access 443
  • 批量将 PDF 文档中的图片提取到指定文件夹
  • 云服务器Ubuntu安装宝塔面板MongoDB修改配置文件本地连接
  • AI Agent 实战:搭建个人在线旅游助手
  • HarmonyOS NEXT开发进阶(十四):HarmonyOS应用开发者基础认证试题集汇总及答案解析
  • 使用kubectl命令
  • GAN随手笔记
  • VC6.0 编译时报错:Error spawning ‘vcspawn.exe‘. The build could not be performed
  • 软件工程面试题(十五)
  • 如何在set和priorty_queue中自定义排序方式
  • 【软考-架构】10.3、处理流程设计-系统设计-人机界面设计
  • Mybatis中封装数据如何自定义一个数据类型处理器
  • MySQL数据库和表的操作之数据库操作
  • J2EE框架技术 第六章 J2EE的AOP
  • 单例模式详解
  • Git 分支
  • 智能交通预警杆:守护道路安全的科技先锋
  • 移动端六大语言速记:第3部分 - 函数与方法
  • Unbantu24.04配置-软件安装