删除排序数组中重复元素的方法
时间:2022-07-22
本文章向大家介绍删除排序数组中重复元素的方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
文章目录
在上一篇文章中讨论了关于如何删除排序链表中重复元素的方法。那么如果底层数据结构是数组又将如何处理呢?
1.删除重复元素,所有元素只保留一次
可以查看leetcode上的26题:
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
需要注意的是,如果仅仅是求不重复元素的长度,那么非常简单,计数器一次遍历就能得到结果。但是,本题要求不仅返回长度,如果长度是n,那么前n项恰好就是去重后的数组。这一点就非常关键了。另外,数组要求额外的空间复杂度不超过 O(1)。 那么面对此问题如何处理呢? 实际上我们需要想到的是,数组的特性。就是可以利用数组下标对数组中的元素进行随机访问。另外,对于本题中的输入数组,除了长度n要求的前n项是有效的之外,n之后的元素项实际上没有什么意义。 此时,不难联想到之前解决链表重复的三指针法。在此处我们也可以巧妙的利用两个指针来解析: 指针分别为 i j 以数组 [0,0,1,1,1,2,2,3,3,4]为例,其解析过程:
遍历完成之后:
代码如下:
public int removeDuplicates(int[] nums) {
if (nums.length == 0){
return 0;
}
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
代码非常简洁,定义了两个指针,i和j。i表示去重之后的数组的最后一项。则用j反复与i比较。i与j中的差值则是重复的项,在下一次遍历过程中将被新的值替换。 提交后效果如下:
2.重复元素保留不超过2次
题目描述:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定 nums = [1,1,1,2,2,3],
函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,1,2,3,3],
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii
这又是一种变体,那么我们只需要在第一个问题的解法中加入一个count计数器,所有元素的次数默认都是1次。那么当count小于2的时候,即使所需要的元素,那么其后一项就可以和j交换。反之,这只把j增加。算法如下:
public int removeDuplicates(int[] nums) {
if (nums.length == 0){
return 0;
}
int i=0;
int count = 1;
for(int j=1;j<nums.length;j++){
if(nums[i] == nums[j]){
count ++;
}else {
count = 1;
}
if(count<=2){
i ++;
nums[i] = nums[j];
}
}
return i+1;
}
提交后如下:
- Open Judge 2750 鸡兔同笼
- POJ 1017 Packets
- Hadoop离线数据分析平台实战——380MapReduce程序优化Hadoop离线数据分析平台实战——380MapReduce程序优化
- 配置远程访问Jupyter+腾讯云超划算活动上车
- HDU 4256 The Famous Clock
- ZOJ 1403&&HDU 1015 Safecracker【暴力】
- Torch7搭建卷积神经网络详细教程
- 爬虫入门到精通-HTTP协议的讲解
- 批量替换文件名和文本文件内容mac
- 抓取手机app的数据(摩拜单车)
- Hadoop离线数据分析平台实战——520项目总结Hadoop离线数据分析平台实战——520项目总结
- 爬虫入门到精通-mongodb的基本使用
- 拒绝撕逼,用数据来告诉你选择器到底哪家强
- 爬虫入门到精通-headers的详细讲解(If-modified-since)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【入坑JAVA安全】JAVA反射机制
- 小妹妹,我想握着你的手,不为别的,只为给你讲清楚CVE-2020-5902
- 不是吧?阿sir!周末你就不学习了吗?
- 灰盒方式通关WebGoat8
- 调试支付宝脱机认证接口遇到的问题总结
- 换一种姿势挖掘任意用户密码重置漏洞
- 表哥,有没有XMLDecoder反序列化的案例?
- 不得不说,minigui真的很坑
- 树的遍历总结
- ggplot2|详解八大基本绘图要素
- LDheatmap|SNP连锁不平衡图(LD)可视化,倒三角图?
- Oracle 表分区笔记
- Java并发编程
- 让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
- ComplexHeatmap|根据excel表绘制突变景观图(oncoplot)