前往
大廳
主題

LeetCode - 80. Remove Duplicates from Sorted Array II 解題心得

Not In My Back Yard | 2022-09-18 12:00:01 | 巴幣 0 | 人氣 299

題目連結:


題目意譯:
給定一按非降序排列之整數陣列 nums,原地(In-place)地移除一些重複的元素使得每種元素出現至多兩次。元素之間的相對順序應在移除過程後保持原樣。

由於對於某些語言來說是無法變更陣列的長度的,因此你必須將結果放在 nums 的第一部分。更正式地說,如果移除重複的元素後剩下 k 個元素,則 nums 的前 k 個元素應為最終的結果。在前 k 個元素之後剩下的是什麼將會被忽略。

將最終結果放在 nums 的前 k 個位置後回傳 k。

請勿分配額外的記憶體來宣告另一個陣列。你必須直接原地修改輸入之陣列,並使用 O(1) 的額外記憶體空間。

客製化評測系統:
本系統將會使用下列的程式碼來評測你的解答:
int[] nums = [...]; // 輸入陣列
int[] expectedNums = [...]; // 預期之答案以及正確之長度

int k = removeDuplicates(nums); // 呼叫你實作的演算法

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有的斷言(Assertions。譯注:簡單來說,陳述式的真值如果為「假」,程式就會停止)都通過了,則你的答案將會被接受。

限制:
1 ≦ nums.length ≦ 3 × 10 ^4
-10 ^ 4 ≦ nums[i] ≦ 10 ^ 4
nums 按非降序排列。



範例測資:
範例 1:
輸入: nums = [1,1,1,2,2,3]
輸出: 5, nums = [1,1,2,2,3,_]
解釋: 你的函式應回傳 k = 5,且 nums 前五個元素依序為 1 、 1 、 2 、 2 和 3。
k 個元素後面是什麼東西並不重要(因此以底線標記)。

範例 2:
輸入: nums = [0,0,1,1,1,1,2,3,3]
輸出: 7, nums = [0,0,1,1,2,3,3,_,_]
解釋: 你的函式應回傳 k = 7,且 nums 前五個元素依序為 0 、 0 、 1 、 1 、 2 、 3 和 3。
k 個元素後面是什麼東西並不重要(因此以底線標記)。


解題思維:
因為 nums 有按照非降序排列,因此數值相同的元素會被排在一起。因此實際上作法跟這題基本上一致,只是因為現在同一種元素可以出現第二次,因此我們需要額外判斷目前可放置位置 x(使用與該鏈結相同的符號來代表)的前一個位置 x - 1 之元素是否出現過了第二次。假如有出現過第二次的話,則之後再出現也不得放到 x 這個位置,直到換到下一種元素為止。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作