26.删除有序数组中的重复项
- 时间复杂度: O(n)
- 空间复杂度: O(1) 思路:
因为是排好序的列表
可以采用双指针,slow和fast
假设有一个数组arr
- 当arr为空就直接返回0
- 当arr不为空,设置slow和fast都为1,fast不断后移,去寻找不重复值(fast前一位和当前fast比较,不相同就为不重复),如果发现不重复值,就赋值给slow,并将slow后移一位,直到fast === n就结束了,返回slow当前值即可
其中slow的意义有以下几点
- 为占位符,用于存放fast发现的不同值
- 为非重复值的数量 fast的含义
- 不断后移寻找不重复的值 比喻一下思路,操作类似fast相当于从数组里面不断发现重复值,然后存进一个数组slowArr,slow去记录实际不重复的数组长度,因为不为数组空的情况下,无论如何都有一个值,所以实际的不重复的数组长度为slowArr.length + 1。只是这些操作在同一个数组里面进行了。
var removeDuplicates = function(nums) {
const n = nums.length;
if (n === 0) {
return 0;
}
let fast = 1, slow = 1;
while (fast < n) {
if (nums[fast] !== nums[fast - 1]) {
nums[slow] = nums[fast]
++slow;
}
++fast;
}
return slow;
};