1. 程式人生 > 其它 >2_26.刪除有序陣列中的重複項

2_26.刪除有序陣列中的重複項

刪除有序陣列中的重複項

題目描述:

解題思路

  • 第一思路:
    第一反應就是雙指標法,但是在寫程式碼的時候,細節沒能處理好,導致修改了很多次,才提交成功。自己的雙指標法,是個假的雙指標,甚至需要三個變數去描述這個雙指標,有點拉胯,還是沒能深刻理解雙指標fastslow的內涵。
  • 題解雙指標法:
    由於有序陣列,那麼對於任意的i < j,如果nums[i] = nums[j],對於任意的i <= k <= j,都必有num[i] = nums[k] = nums[j],因此定義兩個指標fastslow 分別為快指標和慢指標,快指標表示遍歷陣列到達的下標位置,慢指標表示下一個不同元素要填入的下標位置,初始時兩個指標都指向下標1。
    假設陣列nums
    的長度為n。將快指標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;
    }
}

滴水穿石、燕子銜泥,點點滴滴都是添補