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

Leetcode力扣秋招刷题路-0080

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结

80. 删除有序数组中的重复项 II

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

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

说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

示例 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 * 10410^4104
-10410^4104 <= nums[i] <= 10410^4104
nums 已按升序排列

解题思路
一个指针 i 用来遍历 nums 数组,另一个指针 index 始终指向有效数组的末尾。

当前位置上的元素与其前一个元素不相等时,即 nums[i - 1] != nums[i],进行覆盖并将当前位置的元素 nums[i],放到有效数组中最后的位置并令 count 值重新为 1(因为出现了新的元素并且该元素是第一次出现),即 nums[index++] = nums[i];

当相邻位置相等且 count < 2 时,由于题中说到每个元素最多出现两次,所以该元素还可以出现一次,则将当前位置上的元素放到有效数组中的最后位置并令记录该元素的出现次数,即 count++;

当相邻位置相等且 count == 2 时,说明当前值的元素已经出现连续两个相同的了,则不需要进行任何操作,直接 continue 即可。

直到遍历结束,最后返回有效数组的长度 index 即可。

示例:[1,1,1,2,2,3],其中有效数组长度初始为 index = 1. i = 1,nums[0] == nums[1] 且
count = 1,则 nums[1] = nums[1],count = 2,index = 2; i = 2,nums[1] ==
nums[2] 且 count = 2,直接跳过不进行任何处理; i = 3,nums[2] != nums[3] 则 nums[2] =
nums[3],count = 1,index = 3; i = 4,nums[3] == nums[4] 且 count = 1,则
nums[3] = nums[4],count = 2,index = 4; i = 5,nums[4] != nums[5] 则
nums[4] = nums[5],count = 1,index = 5;

最终返回:index = 5,有效数组为 [1, 1, 2, 2, 3]

注意题中说到的每个元素最多出现两次,可以将两次改为 k 次,此时只需要将第二个判断中的 count < 2 修改为 count < k
即可。

代码

class Solution {public int removeDuplicates(int[] nums) {int n = nums.length;if (n <= 2) return n;int count = 1;int index = 1;for (int i=1;i<n;i++) {if (nums[i] != nums[i - 1]) {nums[index++] = nums[i];count = 1;} else if (count < 2) { // 两个元素值相等并且之前没有重复nums[index++] = nums[i];count++;} else {continue;}}return index;}
}

时间复杂度:O(n) 空间复杂度:O(1)

http://www.lryc.cn/news/13820.html

相关文章:

  • Java实现JDBC工具类DbUtils的抽取及程序实现数据库的增删改操作
  • 【docker】拉取镜像环境报错解决#ERROR: Get https://registry-1.docker.io/v2/
  • java中NumberFormat 、DecimalFormat的介绍及使用,java数字格式化,BigDecimal数字格式化
  • 2023什么是分销商城系统?营销,核心功能
  • 天翼数字生活C++客户端实习
  • Java 接口
  • 【React】react-router 路由详解
  • DaVinci 偏好设置:系统 - 内存和 GPU
  • 视频知识点(22)- 教你认清楚YUV420P和YUV420SP的真正差异在哪里
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui
  • 面试常问-Alpha测试和Beta测试
  • html理论基础
  • 【安卓开发】数据存储全方案--详解持久化技术
  • Vue项目实战
  • Github 学生优惠包 -- 最新防踩坑指南
  • 2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(二)
  • 第47章 后端管理首页与Axios拦截守卫原理
  • 【前端】小程序开发入门:安装开发工具、目录结构与项目配置
  • Java反序列化漏洞——CommonsBeanutils1链分析
  • 三菱PLC的MC协议配置说明
  • Python基础复习总结
  • 【Linux操作系统】【综合实验五 网络管理与通信】
  • Qt下实现不规则形状窗口显示
  • 使用ribbon实现负载均衡
  • 从页面仔到工程师,前端到底在发挥什么价值
  • Java程序员进阶宝典,让你学习面试无忧!
  • Hadoop HDFS的主要架构与读写文件
  • 面试题练习第五篇
  • hadoop02【尚硅谷】
  • Alist ——本地网盘管理器