刪除排序陣列中重複元素的方法

2021-10-07 22:33:11 字數 3044 閱讀 7991

可以檢視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++)

需要注意的是,如果僅僅是求不重複元素的長度,那麼非常簡單,計數器一次遍歷就能得到結果。但是,本題要求不僅返回長度,如果長度是n,那麼前n項恰好就是去重後的陣列。這一點就非常關鍵了。另外,陣列要求額外的空間複雜度不超過 o(1)。

那麼面對此問題如何處理呢?

實際上我們需要想到的是,陣列的特性。就是可以利用陣列下標對陣列中的元素進行隨機訪問。另外,對於本題中的輸入陣列,除了長度n要求的前n項是有效的之外,n之後的元素項實際上沒有什麼意義。

此時,不難聯想到之前解決鍊錶重複的三指標法。在此處我們也可以巧妙的利用兩個指標來解析:

指標分別為 i j 以陣列 [0,0,1,1,1,2,2,3,3,4]為例,其解析過程:

**如下:

public int removeduplicates(int nums) 

int i = 0;

for (int j = 1; j < nums.length; j++)

} return i + 1;

}

**非常簡潔,定義了兩個指標,i和j。i表示去重之後的陣列的最後一項。則用j反覆與i比較。i與j中的差值則是重複的項,在下一次遍歷過程中將被新的值替換。

提交後效果如下:

題目描述:

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

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

示例 1:

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

函式應返回新長度 length = 5, 並且原陣列的前五個元素被修改為 1, 1, 2, 2, 3 。

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

示例 2:

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

函式應返回新長度 length = 7, 並且原陣列的前五個元素被修改為 0, 0, 1, 1, 2, 3, 3 。

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

說明:為什麼返回數值是整數,但輸出的答案是陣列呢?

請注意,輸入陣列是以「引用」方式傳遞的,這意味著在函式裡修改輸入陣列對於呼叫者是可見的。

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

// nums 是以「引用」方式傳遞的。也就是說,不對實參做任何拷貝

int len = removeduplicates(nums);

// 在函式裡修改輸入陣列對於呼叫者是可見的。

// 根據你的函式返回的長度, 它會列印出陣列中該長度範圍內的所有元素。

for (int i = 0; i < len; i++)

這又是一種變體,那麼我們只需要在第乙個問題的解法中加入乙個count計數器,所有元素的次數預設都是1次。那麼當count小於2的時候,即使所需要的元素,那麼其後一項就可以和j交換。反之,這只把j增加。演算法如下:

public int removeduplicates(int nums) 

int i=0;

int count = 1;

for(int j=1;j提交後如下:

已排序陣列刪除重複元素

刪除排序陣列中的重複項 思路可以轉變為 前提陣列有序 可以理解為相鄰元素間要不相同,要不不同 要求刪除重複元素,實際上就是將不重複的元素移到陣列的左側。假如乙個有序陣列為 1,1,1,2,2,3,4,5 使用雙指標法 快慢指標 分別為p和q 在迴圈遍歷過程中,第一輪可以將陣列表示為 p在1的位置上q...

leetcode 刪除排序陣列重複元素

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

LeetCode 陣列 刪除有序陣列重複元素

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