[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。

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

 


函數原型

C的函數原型:

int removeDuplicates(int* nums, int numsSize){}

 


邊界判斷

int removeDuplicates(int* nums, int numsSize){
	if( nums == NULL || numsSize <= 0 )
		return 0;
}

 


算法設計:雙指針

思路:因爲數組是排序好的,那重複的元素都在一起。我們可以定義一個指針cnt記錄,再用一個指針i來遍歷元素,如果發現是非重複元素,就用這個非重複元素來覆蓋即可。

int removeDuplicates(int* nums, int numsSize){
	if( nums == NULL || numsSize <= 0 )
		return 0;
		
    int cnt = 1;          // 當前數組中已經篩選出來的非重複元素的個數
    for(int i=1; i<numsSize; i++)
        if( nums[i] != nums[cnt-1] )   // 遍歷到非重複元素
            nums[cnt] = nums[i];       // 下一個非重複元素覆蓋當前的相同元素
            cnt++;                     // 繼續下一個
    return cnt;
}

雙指針的複雜度:

  • 時間複雜度:Θ(n)\Theta(n)
  • 空間複雜度:Θ(1)\Theta(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章