前言
本文章一部分內(nèi)容參考于《代碼隨想錄》----如有侵權(quán)請聯(lián)系作者刪除即可,撰寫本文章主要目的在于記錄自己學(xué)習(xí)體會并分享給大家,全篇并不僅僅是復(fù)制粘貼,更多的是加入了自己的思考,希望讀完此篇文章能真正幫助到您?。?!
算法題(LeetCode 27.移除元素)—(保姆級別講解)
力扣題目鏈接
分析題目
-
整形
數(shù)組 - 刪除元素后的新數(shù)組
可以改變
原有的順序(建議使用雙指針法(快慢指針法
)) - 如果刪除元素后的新數(shù)組
不可以
改變原有的順序(建議使用雙指針法(相向雙指針法
)相向雙指針法本篇文章不講解,在以后的文章中會講解) -
不需要
考慮數(shù)組中超出新長度后面的元素
算法思想(重要)
這里主要講解兩種算法思想,分別是:
- 暴力解法
- 雙指針法(快慢指針法)
暴力解法代碼:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for (int i = 0; i < size; i++) {
if (nums[i] == val) { // 發(fā)現(xiàn)需要移除的元素,就將數(shù)組集體向前移動一位
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
i--; // 因?yàn)橄聵?biāo)i以后的數(shù)值都向前移動了一位,所以i也向前移動一位
size--; // 此時(shí)數(shù)組的大小-1
}
}
return size;
}
};
// 時(shí)間復(fù)雜度:O(n^2)
// 空間復(fù)雜度: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;
}
};
// 時(shí)間復(fù)雜度:O(n)
// 空間復(fù)雜度:O(1)
為了更能讓大家了解暴力解法的算法思想,作者特意畫了一張圖供大家觀看?。?!文章來源:http://www.zghlxwxcb.cn/news/detail-439895.html
反思
快指針
:尋找新數(shù)組
的元素,新數(shù)組就是不含有
目標(biāo)元素的數(shù)組(也就是不包括
被刪除的元素)慢指針
:獲取新數(shù)組
中需要更新的位置
結(jié)束語
如果覺得這篇文章還不錯的話,記得點(diǎn)贊 ,支持下?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-439895.html
到了這里,關(guān)于看完這篇文章你就徹底懂啦{保姆級講解}-----(LeetCode刷題27移除元素) 2023.4.18的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!