1. 程式人生 > >leetcode-26 刪除排序陣列中的重複項(RemoveDuplicatesFromSortedArray)-java

leetcode-26 刪除排序陣列中的重複項(RemoveDuplicatesFromSortedArray)-java

題目:刪除排序陣列中的重複項

給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。

示例 1:

給定陣列 nums = [1,1,2], 

函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為1,2. 

你不需要考慮陣列中超出新長度後面的元素。

示例 2:

給定 nums = [0,0,1,1,1,2,2,3,3,4],

函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為0,1,2,3,4. 

你不需要考慮陣列中超出新長度後面的元素。
public int removeDuplicates(int[] nums) {
    if (nums.length == 0)
        return 0;
    if (nums.length == 1)
        return 1;
    int m = nums[0];
    int count = 0;
    int i = 1;
    while (i < nums.length) {
        if (nums[i] == m) {
            ++ count;
        } else {
            m = nums[i];
            nums[i - count] = m;
        }
        ++ i;
    }
    return 
nums.length - count; }

這裡一定要判斷nums.length == 0的情況//我沒進行判斷的時候出錯了,證明有 空陣列的測試用例

注意題目的條件:(1)有序陣列,(2)不需要考慮陣列中超出新長度後面的元素

變數註釋: 

m //陣列的不重複的元素,也就是新陣列的元素,初始化為nums[0],每次記錄前一個不重複的元素

count //陣列重複的元素個數,初始化為0

i //迴圈下標,初始化為1,不需要判斷nums[0]

思路:

(1)因為是有序陣列,所以一個元素髮生重複,必是連續的,唯一的。

//例如[1,1,1,2],1發生重複,是連續的,也是唯一的,後面不會再出現1

(2)無視重複的元素,將不重複的元素m 放到 nums的0 - newLength中

//遍歷到重複的元素時,count++,繼續往後遍歷;

//遍歷到不重複的元素時,m = nums[i],作為新的mm應該在的位置是當前位置 減去 重複的元素個數 (i-count)

//nums[i-count]=m;

//例如[0,0,1,1,1,2,2,3,3,4],m分別是0,1,2,3,4,將他們分別放到nums[0,1,2,3,4]

//返回newLength = nums.length - count