leetcode刷刷題(43) ---- 刪除排序數組中的重複項(C語言版)

2020-6-3

  • 尋龍千萬看纏山,一重纏是一重關,關門若有千重鎖,定有王侯居此間。
    唐代風水大師-楊筠松 《撼龍經》

題目

  • leetcode – 26. 刪除排序數組中的重複項
給定一個排序數組,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在 原地 修改輸入數組 並在使用 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。
你不需要考慮數組中超出新長度後面的元素。
 
說明:

爲什麼返回數值是整數,但輸出的答案是數組呢?

請注意,輸入數組是以「引用」方式傳遞的,這意味着在函數裏修改輸入數組對於調用者是可見的。

你可以想象內部操作如下:

// nums 是以“引用”方式傳遞的。也就是說,不對實參做任何拷貝
int len = removeDuplicates(nums);

// 在函數裏修改輸入數組對於調用者是可見的。
// 根據你的函數返回的長度, 它會打印出數組中該長度範圍內的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

個人解答:(C版本)

  • 只要使用一個變量記錄當前非重複序列的最後一個位置即可,詳情看代碼註釋。(可以看做是雙指針法)
    int removeDuplicates(int* nums, int numsSize){
        int num = 0;
    	// 判斷是否爲空數組
        if(nums == NULL || numsSize == 0)
            return 0;
    	
    	// num 記錄的是當前當前非重複序列的最後一個位置
        for(int i=1; i<numsSize; ++i)
        {
            if(nums[i] != nums[num])
            {
                nums[++num] = nums[i];
            }   
        }
    
        return num+1;
    }
    
  • 複雜度分析
    1)由於遍歷一遍即可結束,該算法的時間複雜度爲O(n)。
    2)由於只使用了常量空間,空間複雜度爲O(1)。
  • 運行結果:
    在這裏插入圖片描述
他山之石:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章