题目描述:
解题思路
fast
和slow
的内涵。i < j
,如果nums[i] = nums[j]
,对于任意的i <= k <= j
,都必有num[i] = nums[k] = nums[j]
,因此定义两个指针fast
和slow
分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标1。nums
的长度为n。将快指针fast
依次遍历从1到n-1的每个位置,对于每个位置,如果nums[fast] != nums[fast - 1]
,说明nums[fast]
和之前的元素都不同,因此将nums[fast]
赋值到nums[slow]
,然后将slow的值加1,也即指向下一个位置。代码:
class Solution { public int removeDuplicates(int[] nums) { int len = nums.length; int pos = 0;//用于记录当前遍历的位置 int i = 0; for (i = 0; i < len - 1; i++){ int j = pos + 1; while (j < len && nums[j] == nums[i]){//需要判断是否越界 j = j + 1; } if (j >= len){//如果是j >= len这种跳出循环的情况,说明要越界了 return i + 1; } nums[i + 1] = nums[j]; //没越界,赋值给下一个元素 pos = j; if (j == len - 1){ // 如果此时j是最后一个元素,并且nums[i] != nums[j],则最后一个元素也是不同的元素 return i + 2; } } return i + 1; } }
class Solution { public int removeDuplicates(int[] nums) { int n = nums.length; if (n == 0) { return 0; } int fast = 1, slow = 1; while (fast < n) { if (nums[fast] != nums[fast - 1]) { nums[slow] = nums[fast]; ++slow; } ++fast; } return slow; } }