一般回溯法可以用兩種框架,一種遍歷方式(for迴圈),選擇方式(可以理解成到某一節點選擇或者不選)。
比較二者的差別:
1.採用遍歷方式,for(int i=dep;i選擇的方式記得判斷dep是否到達邊界dep==nums.size()同時記得dep++;
2.遍歷方式中for迴圈的臨時變數儲存的是temp[i],選擇方式中是temp[dep];
3.採用選擇方式中,pop完之後還需要繼續進行回溯,而for迴圈中不需要,因為。
乙個例子:
combination sum
given a set of candidate numbers (c
) and a target number (t
), find all unique combinations in c
where the candidate numbers sums to t
.the same repeated number may be chosen from c
unlimited number of times.
note:
for example, given candidate set2,3,6,7
and target7
,
a solution set is:
[7]
[2, 2, 3]
方法1:
class solution
if (sum < 0) return;
for (int i = dep; i < candidates.size(); i++)
} vector> combinationsum(vector& candidates, int target)
};
方法二:
class solution
if (target < 0) return;
if (dep == candidates.size())return;//若不採用for迴圈的方式加上dep邊界
temp.push_back(candidates[dep]);
backtracking(candidates, target - candidates[dep], dep);
temp.pop_back();
target += candidates[dep];//歸位
backtracking(candidates, target - candidates[dep], dep+1);//若不採用for迴圈的方式記得pop完繼續回溯
}vector> combinationsum(vector& candidates, int target)
};
subsets
given a set of distinct integers, nums, return all possible subsets.
note:
for example,
if nums
=[1,2,3]
, a solution is:
[[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
]
方法1:
class solution
} vector> subsets(vector& nums)
};
方法2:
class solution
temp.push_back(nums[dep]);
backtracking(nums, dep + 1);
temp.pop_back();
backtracking(nums, dep + 1);
} vector> subsets(vector& nums)
};
回溯法總結
1 回溯法解決老鼠迷宮問題 求一條路徑 static int maze static int starti 1,startj 1 入口s static int endi 7,endj 7 出口 static boolean falg false public static void visit in...
回溯法總結
1 什麼是回溯法 回溯法也可以叫做回溯搜尋法,它是一種搜尋的方式。其實現使用遞迴。其本質為窮舉所有可能,找到我們想要的解。想要提高回溯法的效率,只能通過剪枝操作,減少重複或者無效的計算,具體手段可以使加快取或者提前中斷回溯。2 回溯法實現 要實現回溯法,需要注意以下三點 a.函式的返回值及引數 b....
leetcode回溯法總結
2018.7.30 前文 回溯法和dfs是不一樣的,回溯法有自己很獨特的模板,dfs是一種思想,回溯法是dfs的一種實現。先來看回溯法的典型題型 find a path to success 有沒有解 find all paths to success 求所有解 1.求所有解的個數 2.求所有解的具...