当前位置:网站首页>【LeetCode】26、删除有序数组中的重复项
【LeetCode】26、删除有序数组中的重复项
2022-07-15 16:25:00 【小曲同学呀】
26、删除有序数组中的重复项
题目:
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
判题标准:
系统会用下面的代码来测试你的题解:
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
示例1:
输入:nums = [1,1,2]
输出:2, nums = [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]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。
不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 10 ^4
-10 ^4 <= nums[i] <= 10 ^4
nums 已按 升序 排列
解题思路:
- 由于给定的数组
nums是有序的,因此对于任意i<j,如果nums[i]=nums[j],则对任意i≤k≤j,必有nums[i]=nums[k]=nums[j],即相等的元素在数组中的下标一定是连续的。利用数组有序的特点,可以通过双指针的方法删除重复元素。 - 如果数组
nums的长度为 0,则数组不包含任何元素,因此返回 0。 - 当数组
nums的长度大于 0 时,数组中至少包含一个元素,在删除重复元素之后也至少剩下一个元素,因此nums[0]保持原状即可,从下标 1 开始删除重复元素。 - 定义两个指针
fast和slow分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 1。 - 假设数组
nums的长度为 n。将快指针fast依次遍历从1 到 n−1的每个位置,对于每个位置,如果nums[fast] !=nums[fast−1],说明nums[fast]和之前的元素都不同,因此将nums[fast]的值复制到nums[slow],然后将slow的值加 1,即指向下一个位置。
遍历结束之后,从nums[0]到nums[slow−1] 的每个元素都不相同且包含原数组中的每个不同的元素,因此新的长度即为slow,返回slow即可。
参考代码:
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < n) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
}

边栏推荐
- forEach、for in、for of三者区别
- 看完这5个理由,我终于知道FTP被替代的原因
- flink. 14. How is the underlying layer of datastream module source implemented?
- 杰理之本修改解码时钟的方法【篇】
- 997. 找到小镇的法官
- Jerry's n turns on the 1-2 function, which will affect the Bluetooth distance [article]
- STM32F4的外部中断
- 探秘ZGC
- 强势出圈的民宿行业 一手好牌如何打破魔咒?
- New usage and deconstruction assignment of data types
猜你喜欢

MySQL CREATE TABLE statement error: 1103 incorrect table name
![[server data recovery] a data recovery case of RAID5 crash caused by hard disk offline during data synchronization of a hot spare disk of an IBM model](/img/58/fa55af5f13fca44bd754281d62a3a7.jpg)
[server data recovery] a data recovery case of RAID5 crash caused by hard disk offline during data synchronization of a hot spare disk of an IBM model

看完这5个理由,我终于知道FTP被替代的原因

External interrupt of stm32f4
Dry goods semantic web, Web3.0, Web3, metauniverse, these concepts are still confused? (top)

强势出圈的民宿行业 一手好牌如何打破魔咒?

数据类型新用法与解构赋值

软件研发效能需求价值流分析专题

CS5801_ HDMI to EDP advantage replaces lt6711a solution

线性代数 笔记1
随机推荐
Face the object
R language uses roc of epidisplay package from. The table function visualizes the ROC curve corresponding to the clinical diagnosis table data and outputs a new diagnostic table, output sensitivity, 1
ECCV 2022 | 多域长尾分布学习,不平衡域泛化问题研究(开源)
函数高级应用
企业在创建产品帮助中心时需要注意的问题!
Iterators and generators
数据类型新用法与解构赋值
R语言ggplot2可视化:使用ggpubr包的ggstripchart函数可视化分组点状条带图(dot strip plot)、设置position参数配置不同分组数据点的分离并且是抖动数据点
如何在企业工作中应用知识管理,解决企业的问题?
R language ggplot2 visualization: use the ggstripchart function of ggpubr package to visualize the dot strip plot, set the position parameter to configure the separation of different grouped data poin
G1这么强,你确定不了解一下?
【30天30个小项目】菜单悬停动画
2、Deep Learning in Higher Dimensions
Functions and arrow functions
函数与Symbol
一致性协议之2PC和3PC
那些年我们用过的分布式锁,你都get到了吗
【系统设计】4S分析法
LeetCode 188. 买卖股票的最佳时机 IV***(double,need triple)
R语言使用lm函数构建线性回归模型、使用I运算符嵌入表达式、使用表达式指定回归方程的形式