Array---Remove Duplicates from Sorted Array——移除排序數組中重複元素

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.算法

Do not allocate extra space for another array, you must do this in place with constant memory.數組

For example,
Given input array A = [1,1,2],app

Your function should return length = 2, and A is now [1,2].ui

思路:this

(1)這道題其實很簡單。主要是由於數組已是排好順序的。若是不仔細看題目,把數組看成無序數組進行操做,OJ時會顯示超時。spa

(2)題目要求是不能申請二額外空間,若是提交時有申請額外空間,也是不經過的。code

(3)還須要注意的一個地方是,數組中元素的位置不能改變。好比對於數組[1,1,1,4,5],移除重複元素後爲[1,4,5],起始數字爲1,而不能是其它數字。排序

(4)咱們只需對對組遍歷一次,並設置一個計數器,每當遍歷先後元素不相同,計數器加1,並將計數器對應在數組中位置定位到當前遍歷的元素。element

算法代碼實現以下:rem

public static int removeDuplicates(int[] A) {
    int len = A.length;
    if (len == 0)
        return 0;
    int count = 1;
    for (int i = 1; i < len; i++) {
        if (A[i] == A[i - 1]) {
            continue;
        }else{
            A[count] = A[i];
            count++;
        }
    }
    return count;
}

上面的解法是針對有序數組,若是是無序數組,應該如何解答?

思路:

(1)若是不容許申請額外空間,則能夠先對數組進行排序,爲了提升效率通常考慮使用快速排序,而後再參照上面有序數組進行操做;

(2)若是容許申請空間,則只需建立一個HashSet,遍歷一次數組,經過contanins()方法進行判斷就能獲得結果。

(1)和(2)所對應代碼以下所示(注:針對本文所示的題目,若是用下面代碼進行OJ,(1)會超時,(2)會產生額外空間):

不能夠申請額外空間:

public static int removeDuplicates(int[] A) {
    int len = A.length;
    if (len == 0)
        return 0;

    quickSort(A, 0, len - 1);

    int count = 1;
    for (int i = 1; i < len; i++) {
        if (A[i] == A[i - 1]) {
            continue;
        } else {
            A[count] = A[i];
            count++;
        }
    }
    return count;
}

//快速排序

private static void quickSort(int[] table, int low, int high) {
    if (low < high) {
        int i = low, j = high;
        int vot = table[i];
        while (i != j) {
            while (i < j && vot <= table[j])
                j--;
            if (i < j) {
                table[i] = table[j];
                i++;
            }
            while (i < j && table[i] < vot)
                i++;
            if (i < j) {
                table[j] = table[i];
                j--;
            }
        }
        table[i] = vot;
        quickSort(table, low, j - 1);
        quickSort(table, i + 1, high);
    }
}

能夠申請額外空間:(其中,HashSet的contains()方法是用來過濾重複元素的)

public static int removeDuplicates(int[] A) {
    int len = A.length;
    HashSet set = new HashSet();
    for (int i = 0; i < len; i++) {
        if (set.size() == 0) {
            set.add(A[i]);
        }
        if (!set.contains(A[i])) {
            set.add(A[i]);
        }
    }
    return set.size();
}
相關文章
相關標籤/搜索