題目連結(jié):
題目意譯:
給定一按非降序排列之整數(shù)陣列 nums,原地(In-place)地移除一些重複的元素使得每種元素出現(xiàn)至多兩次。元素之間的相對順序應在移除過程後保持原樣。
由於對於某些語言來說是無法變更陣列的長度的,因此你必須將結(jié)果放在 nums 的第一部分。更正式地說,如果移除重複的元素後剩下 k 個元素,則 nums 的前 k 個元素應為最終的結(jié)果。在前 k 個元素之後剩下的是什麼將會被忽略。
將最終結(jié)果放在 nums 的前 k 個位置後回傳 k。
請勿分配額外的記憶體來宣告另一個陣列。你必須直接原地修改輸入之陣列,並使用 O(1) 的額外記憶體空間。
客製化評測系統(tǒng):
本系統(tǒng)將會使用下列的程式碼來評測你的解答:
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 有按照非降序排列,因此數(shù)值相同的元素會被排在一起。因此實際上作法跟
這題基本上一致,只是因為現(xiàn)在同一種元素可以出現(xiàn)第二次,因此我們需要額外判斷目前可放置位置 x(使用與該鏈結(jié)相同的符號來代表)的前一個位置 x - 1 之元素是否出現(xiàn)過了第二次。假如有出現(xiàn)過第二次的話,則之後再出現(xiàn)也不得放到 x 這個位置,直到換到下一種元素為止。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。