2_26.刪除有序陣列中的重複項
阿新 • • 發佈:2021-10-15
刪除有序陣列中的重複項
滴水穿石、燕子銜泥,點點滴滴都是添補
題目描述:
解題思路
- 第一思路:
第一反應就是雙指標法,但是在寫程式碼的時候,細節沒能處理好,導致修改了很多次,才提交成功。自己的雙指標法,是個假的雙指標,甚至需要三個變數去描述這個雙指標,有點拉胯,還是沒能深刻理解雙指標fast
和slow
的內涵。 - 題解雙指標法:
由於有序陣列,那麼對於任意的i < j
,如果nums[i] = nums[j]
,對於任意的i <= k <= j
,都必有num[i] = nums[k] = nums[j]
,因此定義兩個指標fast
和slow
分別為快指標和慢指標,快指標表示遍歷陣列到達的下標位置,慢指標表示下一個不同元素要填入的下標位置,初始時兩個指標都指向下標1。
假設陣列nums
fast
依次遍歷從1到n-1的每個位置,對於每個位置,如果nums[fast] != nums[fast - 1]
,說明nums[fast]
和之前的元素都不同,因此將nums[fast]
賦值到nums[slow]
,然後將slow的值加1,也即指向下一個位置。
遍歷結束後,返回slow即可。
程式碼:
自己寫的爛程式碼
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; } }