leetcode 刷题记:26. 删除有序数组中的重复项
这道题如果在实际工作中其实不容易遇到,因为想把一个数组去重,一个Set
就足以。然而这道题有猫腻:原地修改
。
问题描述
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 $O(1)$ 额外空间的条件下完成。
1 |
|
解题思路
原本我就是使用Set
来做这道题的,最后发现一直给我报错。问题就出在原地
上。
1 |
|
这里要把数组原地替换,把第一次出现的元素移到重复的元素位置上,实现原地修改。
因为整个数组是有顺序的,就可以用比大小的方式来判断相邻两个元素是否是相同。这里使用快慢指针的方式解决这个问题,i
是插入操作指针,j
是遍历指针。只要判断j
指针的元素大于或者不等于i
,就更新i+1
位置的元素为j
指针的元素。
代码:
1 |
|
题外话
上面提到的Set
去重数组,如果数组元素是个Object
,记得深度拷贝。否则会出现去重后的数组会影响原来的数组。
我一般的深度拷贝是用下面这种,主要是我也没写代码实现过这东西。
1 |
|
leetcode 刷题记:26. 删除有序数组中的重复项
https://bubao.github.io/posts/c60f7105.html