leetCode篇

125 阅读1分钟

26.删除有序数组中的重复项

  • 时间复杂度: O(n)
  • 空间复杂度: O(1) 思路:

因为是排好序的列表

可以采用双指针,slow和fast

假设有一个数组arr

  • 当arr为空就直接返回0
  • 当arr不为空,设置slow和fast都为1,fast不断后移,去寻找不重复值(fast前一位和当前fast比较,不相同就为不重复),如果发现不重复值,就赋值给slow,并将slow后移一位,直到fast === n就结束了,返回slow当前值即可

其中slow的意义有以下几点

  1. 为占位符,用于存放fast发现的不同值
  2. 为非重复值的数量 fast的含义
  3. 不断后移寻找不重复的值 比喻一下思路,操作类似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;
};