題目
給定一個整數陣列 nums 和一個整數 val,要求 就地移除陣列中所有等於 val 的元素,並返回剩餘元素的數量 k。
剩下的元素順序可以改變,超出 k 之後的元素不需要關心。
範例
Input: nums = [3,2,2,3], val = 3
Output: 2, nums = [2,2,,]
Explanation: 返回 k = 2,前兩個元素為 2。
Input: nums = [0,1,2,2,3,0,4,2], val = 2
Output: 5, nums = [0,1,4,0,3,,,_]
Explanation: 返回 k = 5,前五個元素為 0,1,4,0,3,順序可以改變。
解題思路
這題可以用 雙指標法:
用一個指標 k 表示新陣列的長度。
遍歷整個陣列,當 nums[i] != val 時,把它放到 nums[k] 並移動 k。
最後返回 k。
時間複雜度:O(n)
空間複雜度:O(1)
程式碼(Java)
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
if (nums[left] == val) {
nums[left] = nums[right];
right--;
} else {
left++;
}
}
return left;
}
}
心得
這題的技巧跟「Remove Duplicates」有點相似,但它更靈活,因為不需要保持原有順序,甚至可以直接用交換法優化。
對我來說,這題像是在過濾掉不想要的東西,把有用的集中到前面,剩下的部分就丟掉。