從排序陣列中刪除重複項

2021-09-20 06:06:04 字數 1957 閱讀 7409

解題方法二

方法三

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

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

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

函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 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++

)

思路

這個思路稍微繁雜一點,而且相對於下面的這種方法,時間複雜度跟長。

可能是因為,之前做過重複字母計數這一塊,所以一開始想到了這一點,但這題完全沒有必要,具體看第二種方法。

想法是:理解為消消樂

操作有點繁瑣,需要仔細考慮遍歷的位置與計數。

考慮的角度:字元陣列本身去重

**

class

solution

// 初始化引數

int current = nums[0]

;int count =0;

int length = nums.length;

for(

int i =

0; i < length; i++

)else

// 縮短陣列長度

length = length - count +1;

i -= count;

}// 重新規整

current = nums[i]

; count =1;

}}// 排除當最後那一段有重複

if(count >1)

return length;

}}

思路

遍歷記錄當前,可以存放字元的位置,同時找到與前面沒有重複的數字,進行替換。

思考角度:位置與字元的匹配

**

public

class

solution

}return nums.length ==0?

0: currentindex +1;

}}

思路

和方法二有點類似,應該說幾乎一樣,把他想成乙個棧。

假設前面都是沒有重複的字元,因為字元是進過排序的,那麼只要不與最後乙個相同,就可以壓入棧中。

和插入排序的思想有點類似

這個思想有乙個優點,就是當他是亂序時候,也可以行得通。

思考角度:搭建乙個特殊的資料結構

**

class

solution

}// 如果當前 nums = ,應該返回0

return nums.length ==0?

0: top +1;

}}

從排序陣列中刪除重複項

nums 是以 引用 方式傳遞的。也就是說,不對實參做任何拷貝 int len removeduplicates nums 在函式裡修改輸入陣列對於呼叫者是可見的。根據你的函式返回的長度,它會列印出陣列中該長度範圍內的所有元素。for int i 0 i len i 核心思想 list是有序的,將不...

從排序陣列中刪除重複項

給定乙個排序陣列,你需要在原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被修改為1...

從排序陣列中刪除重複項

給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度2,並且原陣列 nums 的前兩個元素被修改為1,2...