摘要:用來(lái)存放每一個(gè)可能的結(jié)果最終結(jié)果深度優(yōu)先遍歷剪枝當(dāng)遍歷到底個(gè)數(shù)是,如果的元素個(gè)數(shù)剩余元素個(gè)數(shù)時(shí),就不滿足條件了中元素個(gè)數(shù)達(dá)到,表示深度優(yōu)先遍歷到達(dá)最深處了。
給定兩個(gè)整數(shù)?n
?和?k
,返回范圍?[1, n]
?中所有可能的?k
?個(gè)數(shù)的組合。
你可以按?任何順序?返回答案。
思路:
如果解決一個(gè)問(wèn)題有多個(gè)步驟,每一個(gè)步驟有多種方法,題目又要我們找出所有的方法,可以使用回溯算法;
回溯算法是在一棵樹(shù)上的 深度優(yōu)先遍歷(因?yàn)橐宜械慕?,所以需要遍歷);
為什么說(shuō)是在一棵樹(shù)上的深度優(yōu)先遍歷呢?比如說(shuō),你現(xiàn)在要解決一個(gè)問(wèn)題,這個(gè)問(wèn)題被分為了若干的步驟,對(duì)于每一個(gè)步驟都有多個(gè)方法到下一個(gè)步驟。(聽(tīng)君一席話,就是一席話,嘿嘿嘿?。。?。就是說(shuō)我們么一個(gè)步驟的選擇都是可以返回來(lái)更換的。
就拿本題來(lái)說(shuō):
? ? ? ? 比如說(shuō)給了4和3這兩個(gè)數(shù)據(jù);我們要從1,2,3,4,這4個(gè)數(shù)里面取3個(gè)數(shù)。很容易分析出來(lái):當(dāng)我們第一個(gè)數(shù)取1的時(shí)候,第二個(gè)數(shù)可以去2,3,4,.........。一次推下去。我們會(huì)得到一棵一棵的樹(shù)。樣子就是這個(gè)樣子(這個(gè)不是我畫(huà)的,我去LeetCode的題解上找到哈哈哈哈!!)
?想明白這個(gè)過(guò)程,那我們的解題辦法就來(lái)了。對(duì)于[1? n]里面的每一個(gè)數(shù),在最后選擇的k個(gè)數(shù)里面的只有兩種狀態(tài),要么它在,要么它不在。所以我們只需要去遍歷這n個(gè)數(shù),然后用一個(gè)數(shù)組temp把放入最后結(jié)果的數(shù)記錄下來(lái)。由于我們是從小到大遍歷,所以當(dāng)我們把當(dāng)前元素在最后結(jié)果里面的記錄完以后,后面再記錄的結(jié)果就不會(huì)再包含當(dāng)前元素了。
class Solution {public: //temp 用來(lái)存放每一個(gè)可能的結(jié)果 vector temp; //最終結(jié)果 vector> ans; //深度優(yōu)先遍歷 void dfs(int cur, int n, int k) { // 剪枝:當(dāng)遍歷到底cur個(gè)數(shù)是,如果temp的元素個(gè)數(shù)s+剩余元素個(gè)數(shù)t> combine(int n, int k) { dfs(1, n, k); return ans; }};
思路:通過(guò)上一題,這一題理解起來(lái)就更方便了。全部排列順序,就是上面的那個(gè)圖,第二次先選擇了2以后還可以繼續(xù)選擇1;所以我們只需要把每次選取的元素交換到數(shù)組左邊,這樣就可以和上一題的流程一樣了,不過(guò)記住記住排列的時(shí)候,未選擇的元素都可以來(lái)占當(dāng)前cur的位置,由于我們將未選擇的元素都交換到cur的右邊,所以從cur遍歷一遍就可以了。就是這么簡(jiǎn)單,k默認(rèn)為n就可以了。
class Solution {public: void dfs(vector>& res, vector& output, int cur, int len){ // 所有數(shù)都填完了 if (cur == len) { res.emplace_back(output); return; } //這里每一個(gè)數(shù)組右邊的數(shù)都可以當(dāng)做第cur個(gè)元素 for (int i = cur; i < len; ++i) { // 動(dòng)態(tài)維護(hù)數(shù)組,將未選取的元素交換到數(shù)組右邊 swap(output[i], output[cur]); // 繼續(xù)遞歸填下一個(gè)數(shù) dfs(res, output, cur + 1, len); // 撤銷交換操作 swap(output[i], output[cur]); } } vector> permute(vector& nums) { vector > res; dfs(res, nums, 0, (int)nums.size()); return res; }};
給定一個(gè)字符串S
,通過(guò)將字符串S
中的每個(gè)字母轉(zhuǎn)變大小寫(xiě),我們可以獲得一個(gè)新的字符串。返回所有可能得到的字符串集合。
思路: 注意理解題目要求,題目是說(shuō)每個(gè)子母可以進(jìn)行大小寫(xiě)變換,但是沒(méi)有說(shuō)可以改變位置哦。
class Solution {public: void dfs(vector &res,int cur,string &s,int len){ //數(shù)字不變 while(cur= "0" && s[cur] <= "9") cur++; if(cur == len){ res.emplace_back(s); return ; } //子母轉(zhuǎn)變大小寫(xiě) if(s[cur]>="a"&&s[cur]<="z") s[cur] = toupper(s[cur]); else s[cur] = tolower(s[cur]); dfs(res,cur+1,s,len); //子母不轉(zhuǎn)變大小寫(xiě) if(s[cur]>="a"&&s[cur]<="z") s[cur] = toupper(s[cur]); else s[cur] = tolower(s[cur]); dfs(res,cur+1,s,len); } vector letterCasePermutation(string s) { vector res; int len = s.length(); dfs(res,0,s,len); return res; }};
蕪湖~~~~~~~~~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/123336.html
摘要:斬從第題開(kāi)始,到現(xiàn)在也差不多快一年了,回顧紀(jì)念一下。當(dāng)時(shí)對(duì)回溯動(dòng)態(tài)規(guī)劃也都只是上課的時(shí)候?qū)W過(guò),也并不熟練。最經(jīng)典的例子就是斐波那契數(shù)列了,求第項(xiàng)數(shù)列的值。 leetcode 100 斬!從第 1 題開(kāi)始,到現(xiàn)在也差不多快一年了,回顧紀(jì)念一下。 showImg(https://segmentfault.com/img/bVbu461?w=661&h=191); 為什么開(kāi)始刷題? 從大一就...
摘要:現(xiàn)在發(fā)出來(lái)的版本,我重新使用了語(yǔ)言實(shí)現(xiàn)。其實(shí)我之前介紹的老師課程也大量參考和使用算法這本書(shū)上的思路和例題??催@本書(shū)主要是讓我覺(jué)得算法可以以比較輕松的方式入門。劍指這本書(shū)主要用于準(zhǔn)備算法面試,在網(wǎng)絡(luò)上備受好評(píng)。 我是一個(gè)半路出家的程序員,在我剛開(kāi)始從事編碼工作的頭幾年,我沒(méi)有接觸過(guò)算法和數(shù)據(jù)結(jié)構(gòu),覺(jué)得它們是只會(huì)在我找工作的時(shí)候用得到的知識(shí)。盡管有很多人跟我說(shuō)過(guò)算法和數(shù)據(jù)結(jié)構(gòu)無(wú)比重要,我也...
馬上就要開(kāi)始啦這次共組織15個(gè)組隊(duì)學(xué)習(xí) 涵蓋了AI領(lǐng)域從理論知識(shí)到動(dòng)手實(shí)踐的內(nèi)容 按照下面給出的最完備學(xué)習(xí)路線分類 難度系數(shù)分為低、中、高三檔 可以按照需要參加 - 學(xué)習(xí)路線 - showImg(https://segmentfault.com/img/remote/1460000019082128); showImg(https://segmentfault.com/img/remote/...
閱讀 2590·2021-11-18 10:02
閱讀 2627·2021-11-15 11:38
閱讀 3696·2021-11-12 10:36
閱讀 694·2021-11-12 10:34
閱讀 2887·2021-10-21 09:38
閱讀 1478·2021-09-29 09:48
閱讀 1491·2021-09-29 09:34
閱讀 1088·2021-09-22 10:02