26. 删除有序数组中的重复项 与 80. 删除有序数组中的重复项 II
题目:
思路:
【1】26. 删除有序数组中的重复项的思路(双指针)
首先明确数组第一位是不会变动的,因为前面没有可以比较的元素
所以记录它的下标left可以作为比对元素的下标
其次当遍历整个数组的时候如果出现某个元素的数值与对比元素不同时
理应将该元素放置于比对元素的后面(即left+1的地方)
此时比对元素将变更为新放置的元素
以此类推
当遍历完整个数组的时候
left便是新数组的length-1的下标了
所以数组长度为left+1
【2】80. 删除有序数组中的重复项 II的思路
在原本简单版本上加上一个limit的判断,如果不满足2则可以多加一个进去。
代码展示:
【1】26. 删除有序数组中的重复项的代码(双指针)
//时间0 ms 击败 100% //内存42.9 MB 击败 71.19% //时间复杂度:O(n),其中 n 是数组的长度。快指针和慢指针最多各移动 n 次。 //空间复杂度:O(1)。只需要使用常数的额外空间。 class Solution { public int removeDuplicates(int[] nums) { int left = 0; for (int i = 1; i < nums.length; i++){ if (nums[left] != nums[i]){ left++; nums[left] = nums[i]; } } return left + 1; } }
【2】80. 删除有序数组中的重复项 II的代码
//时间0 ms 击败 100% //内存42.8 MB 击败 13.35% //时间复杂度:O(n),其中 n 是数组的长度。我们最多遍历该数组一次。 //空间复杂度:O(1)。我们只需要常数的空间存储若干变量。 class Solution { public int removeDuplicates(int[] nums) { int left = 0; int limt = 1; for (int i = 1; i < nums.length; i++){ if (nums[left] != nums[i]){ left++; limt = 1; nums[left] = nums[i]; }else if (limt == 1){ left++; limt++; nums[left] = nums[i]; } } return left + 1; } } //时间0 ms 击败 100% //内存42.7 MB 击败 21.76% class Solution { public int removeDuplicates(int[] nums) { int n = nums.length; if (n <= 2) { return n; } int slow = 2, fast = 2; while (fast < n) { if (nums[slow - 2] != nums[fast]) { nums[slow] = nums[fast]; ++slow; } ++fast; } return slow; } }