1. 程式人生 > >leetcode (Remove Duplicates from Sorted Array)

leetcode (Remove Duplicates from Sorted Array)

Title: Remove Duplicates from Sorted Array    26

Difficulty:Easy

原題leetcode地址:https://leetcode.com/problems/remove-duplicates-from-sorted-array/

 

1. 採用雙引用(指標),時間&空間複雜度如下:

時間複雜度:O(n),一層while迴圈,遍歷的是陣列的長度。

空間複雜度:O(n),沒有申請額外的空間。

    /**
     * 採用雙指標(快慢指標)來記錄遍歷的座標,開始是兩個指標都是指向第一個數字,
     *      如果兩個指標指向的數字相同,快指標向前一步,慢指標不動
     *      如果兩個指標指向的數字不同,兩個指標都向前一步,同時需要把快指標的值賦值給慢指標的值
     *      最後,快指標遍歷完,慢指標的位置就是返回的值(座標+1)
     * @param nums
     * @return
     */
    public static int removeDuplicates(int[] nums) {
        if (nums.length <= 0) {
            return 0;
        }

        int slow = 0;
        int qick = 0;

        while (qick < nums.length) {
            if (nums[slow] == nums[qick]) {
                ++qick;
            } else {
                nums[++slow] = nums[qick++];
            }
        }
        return slow + 1;
    }

2.  採用雙引用(指標),上述時while迴圈,這裡的是for迴圈。時間&空間複雜度如下:

時間複雜度:O(n),一層for迴圈,遍歷的是陣列的長度。

空間複雜度:O(n),沒有申請額外的空間。

    /**
     * for迴圈,i相當於上述的qick,機相當於上述的slow
     * @param nums
     * @return
     */
    public static int removeDuplicates1(int[] nums) {
        if (nums.length <= 0) {
            return 0;
        }

        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != nums[j]) {
                nums[++j] = nums[i];
            }
        }

        return j + 1;
    }