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...