数组算法之一——有序数组去重

本文通过通俗易懂的方式解析了如何在有序数组中删除重复元素,保留每个元素最多两次出现,同时强调了在原地修改数组且空间复杂度为O(1)的解决方案。讲解了关键的双指针和比较策略,并提供了LeetCode通用解法作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


用简单通俗易懂的话来记录自己对数组算法的理解

1.原题

1.题目

给你一个有序数组 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.分析

1.分析

(1)不能创建新的数组去保存删除后的集合,所以,必须使用临时变量表示删除后的数组的长度。
(2)有序数列最多两个重复,可以想到第i个和第i-2个不能重复,所以,第arr[i]与arr[i-2]进行对比
(3)由于要求必须对原数组进行操作,所以原,要将不重复的数据进行复制。

3.思路

(1)声明临时变量,标记新的数组的大小newSize
(2)遍历整个数组,第i与第i-2的数组对象做对比,如果不同,则newSize++,同时,将num赋值给arr[newSize]
(3)返回去除重复的数组大小newSize
(4)当前是最多两个重复,可以推广到最多K个重复。

4.代码

private int removeDuplicates(int[] arr){

int newArrLength = 0;

for (int i = 0; i < arr.length; i++) {

if ((i < 3) || (arr[i] != arr[i - 2])) {
arr[newArrLength++] = arr[i];

}
}

return newArrLength;
}

结果:
在这里插入图片描述

5.巨人肩膀

1.LeetCode通用解法
2.双指针解法也有人认为可以采用双指针揭发,慢指针是指向将要赋值的位置,快指针是正常的遍历。实际上和通用算法思想是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值