《LeetCode刷題筆記》Day3——刪除元素
阿新 • • 發佈:2021-12-17
給你一個數組 nums和一個值 val,你需要 原地 移除所有數值等於val的元素,並返回移除後陣列的新長度。
這種題就是利用雙指標法。
先定義一個快指標在前面,再定義一個慢指標在後面,如果快指標掃到的不是Val元素,則前進一格,慢指標的值等於快指標,並且慢指標++ ;
如果快指標掃到了Val元素,則慢指標不動。但是後面還會慢指標的值等於快指標,只是少了一步++
比如
for (slowIndex = 0; fastIndex < nums.length; fastIndex++) { if (nums[fastIndex] != val) { nums[slowIndex] = nums[fastIndex]; slowIndex++; } }
這裡面,每當掃描到快指標的值不等於Val,就大家一起增加;
一旦掃到Val值,那麼快指標繼續向前,而慢指標不動,同時沒有nums[slowIndex]=nums[fastIndex]和slowIndex++這兩步;
但繼續迴圈之後,nums{slowIndex]還是會等於nums[fastIndex]。區別在於slowIndex++少了一步,這也就是慢指標和快指標分開的原因。
最後輸出慢指標,就是刪除之後的陣列。
總體程式碼:
// 時間複雜度:O(n)
// 空間複雜度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};