今天做的LeetCode27還是蠻簡單的,但是收穫很大。
此題的目的就是在序列中刪除指定值。
可以這麼辦
從頭開始遍歷數組
用count計數:記錄這個元素在數組中出現的次數
每個元素依次向前挪動這些個單位
但感覺這個方法太笨了,轉換思路,得到以下解法
用兩個指針,一個負責遍歷全部元素,另一個指向當前符合要求的元素,得到如下代碼:
int removeElement(vector<int>& nums, int val) {
if (nums.size == 0)
return 0;
int id = 0;
for (int i = 0; i < nums.size; i++)
{
if (nums[i]!=val)
{
nums[id] = nums[i];
id++;
}
}
return id;
}
代碼並不難理解,就是遇見需要去除的元素直接忽略,當得到符合條件的元素的時候用id進行標記
但題目中的要求是可以打亂元素順序。官方給出了一種很巧妙的解決思路。利用此思路得出以下解決辦法,速度比之前快很多。代碼如下:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
for (int i = 0; i < n ; )
{
if (nums[i] == val)
{
nums[i] = nums[n-1];
n--;
}
else
i++;
}
return n;
}
這種方法在刪除元素較少的時候速度要比前一種快很多
前一種方法適合在需要刪除的元素比較多的時候使用