力扣刷題筆記9 深度優先(DFS)系列

2022-09-18 08:51:54 字數 3586 閱讀 2632

1.**號碼的任意組合

解題思路:這是一道典型的dfs題型,需要遍歷所有情況,針對dfs主要考慮三點即可。一是截止條件;二是遍歷候選節點;三是對候選節點進行篩選

這道題dfs函式裡的截止條件無疑就是字串長度滿足digits.size()時即可插入到res中(res是我們返回的結果),並且跳出當前遞迴,候選節點即是數字所代表的字元

具體**入下:

class solution ;

void dfs(vector&res,int l,string str,string s)

for(auto i:p[str[l]-'0'])//遍歷候選節點

}vectorlettercombinations(string digits) 

};2.組數總和

解題思路:這道題最重要的也是要找到截止條件,我設立了變數m來計算每個組合的累加值,當數值大於等於目標值時,就可以推出當前遞迴了,不過退出前需要判斷m是不是剛好

等於目標值,如果剛好相等。並且該組合在解集中不存在就可以存入解集。

**如下:

class solution 

return;

}for(int i=0;i//遍歷所有解集

}vector> combinationsum(vector& candidates, int target) 

};3.全排列

解題思路:這道題的截止條件是組合個數,當組合個數等於num.size()時,就可以把結果插入到解集了。注意nums中的數字在同一組合中不能重複使用,

這就需要對候選節點進行篩選,具體的篩選過程和**如下所示:

class solution 

for(int i=0;i}}

vector> permute(vector& nums) 

};4.全排列2

解題思路:這道題是上題的變種,但是這道題的nums陣列可能是重複的,因此會產生相同的組合。所以需要在上一道題的基礎上對篩選條件進行改進。

具體的改進措施是建立一ff陣列專門存放nums中數字的個數。每次進入遞迴前將ff陣列中對應的值-1。並且在每次遞迴前判斷對應位置的值是否大於0,

如果大於才能進入遞迴

**如下:

class solution 

for(int i=0;i//遍歷可能的結點}}

vector> permuteunique(vector& nums) 

dfs(f,ff,fff,res,nums.size());

return res;}};

5.括號生成

解題思路:先判斷截止條件,當字串中'('個數和』)'個數都為3時就可以把該字串插入到結果中。接下來判斷篩選條件,用兩個陣列記錄字串中'('個數和'('個數,

當符串中'(『和')'個數相同時,只能把'('放入字串,否則'('和')'都能放入字串

具體**如下圖所示

class solution 

if(f[0]>0)//只要左括號個數沒到達n個,左括號就可以插入到字串中

if(f[1]>0&&f[1]!=f[0])//只有左右括號個數不相同時才能將右括號插入到字串 }

vectorgenerateparenthesis(int n) ;

string p="";

dfs(res,p,f);

return res;}};

6.路徑總和||

解題思路:首先找到截止條件,這道題很明顯,每次遞迴到葉子節點後就可以退出遞迴。即找到葉子結點就是截止條件的關鍵,

所以這道題的截止條件就是在不斷的dfs中總會出現乙個結點,該結點的左右孩子都為空,只要找到這個結點,就可以判斷從根節點到

該節點的數值總和是否等於目標值,如果相等就可以將該組合插入到結果中。

具體**如下:

public:

void dfs( treenode *node,vector>&res,vectorp,int target)

if(node->left!=nullptr)//篩選條件:判斷結點的左孩子是否為空,如果不為空,將該左孩子的值插入到該組合中,並且進入遞迴

if(node->right!=nullptr)//篩選條件:判斷結點的右孩子是否為空,如果不為空,將該右孩子的值插入到該組合中,並且進入遞迴

}vector> pathsum(treenode* root, int targetsum) 

};7.求根節點到葉子節點數字之和

解題思路:這道題的截止條件和篩選條件和上道題幾乎一樣,這裡就不多做解釋了,直接放**:

class solution 

else

if(node->right!=nullptr)//篩選條件}}

int sumnumbers(treenode* root) 

};8.島嶼數量

解題思路:這種二維陣列的dfs題其實和樹的dfs題很像,只不過樹是左右孩子兩種轉移方法。而二維陣列中的每個數,都可以

上下左右四個方向移動,所以有四個判斷條件,只要滿足這四個條件,就可以繼續向下遞迴。具體**如下圖所示

class solution 

if(i+1

if(j-1>=0&&g[i][j-1]=='1')   

if(j+1

}int numislands(vector>& grid) }}

return res;}};

力扣(LeetCode)刷題筆記

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。注 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...

刷題筆記 力扣283 移動零

獲得的思考 獲得的思考 給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0 1,0 3,12 輸出 1 3,12 0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。思路 先統計容器中0的個數,刪掉所有的零,並在結尾補零 cla...

力扣刷題筆記 376 擺動序列

題目 376.擺動序列 如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差 如果存在的話 可能是正數或負數。少於兩個元素的序列也是擺動序列。例如,1,7,4,9,2,5 是乙個擺動序列,因為差值 6,3,5,7,3 是正負交替出現的。相反,1,4,7,2,5 和 1,7...