1. 程式人生 > >乘風破浪:LeetCode真題_026_Remove Duplicates from Sorted Array

乘風破浪:LeetCode真題_026_Remove Duplicates from Sorted Array

乘風破浪:LeetCode真題_026_Remove Duplicates from Sorted Array

一、前言

    我們這次的實驗是去除重複的有序陣列元素,有大體兩種演算法。

二、Remove Duplicates from Sorted Array

2.1 問題

     題目大意理解,就是對陣列進行元素去重,然後返回去處重複之後的長度,無論我們對陣列做了什麼的修改,都沒有關係的,只要保證再返回的長度之內的陣列正確性即可。因為最後是根據長度來遍歷的,因此我們不用擔心。

2.2 分析與解決

     題目說的很清晰了,因此,我們首先想到了笨辦法,那就是從左往右遍歷,如果發現相等的元素,就將後面的元素集體前移,這樣最差的時間複雜度是O(n~2)。因此我們想想有沒有簡單的方法,於是我們想到了只用找一個指標在前面開路,遇到不同的元素了,將這個元素填到相應的位置,然後繼續搜尋,直至遍歷完所有的元素即可,這樣一次遍歷就能解決問題,時間複雜度O(n~2),只不過也留下了髒空間,不過題目說了不用我們管了,於是問題解決。

     第一種是笨辦法:

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

   第二種是一次遍歷:

public class Solution {
    /**
     *
     * 題目大意
     * 給定一個排序的陣列,將陣列中的重複元素去掉,相同的只保留一個作為新陣列的元素,
     * 並且返回陣列新的元素個數,
     * 不要建立一個新的陣列來儲存結果。在常量時間內解決這個問題
     *
     * 解題思路
     * 從第二個元素開始處理,記為當前處理的元素,如果當前元素與他的前一個元素相同就刪除這個元素,
     * 如果不同就將它移動到正確的位置,返回最後陣列元素個數。
     */
    public int removeDuplicates(int[] A) {

        if (A.length == 0) {
            return 0;
        }

        int index = 0;//[0,index]只記錄陣列中出現的按從小到大的唯一一個數,已經排好序了
        int next = 1;

        // 演算法思想:找index之後的比A[index]大的數,如是找到就移動到A[index+1]處,
        // index移動到下一個位置,next移動到下一個位置,再找比A[index]大的數

        while (next < A.length) {
            while (next < A.length && A[index] == A[next]) { // 找不等於陣列中最
                next++;
            }

            if (next < A.length) {
                index++;
                A[index] = A[next];
                next++;
            }
        }
        return index + 1;
    }
}

 

三、總結

    將O(n~2)的複雜度下降一個等級,其實就是簡單的利用了一些技巧和思維,但是節省而來的大量的運算時間。