回溯算法
《代码随想录》回溯算法:组合
本题完整题目如下:
本题的完整思路如下: 1.本题使用回溯算法,其实回溯和递归是一样的道理,也是分为三步曲进行: 2.第一步:确定递归函数的返回值和参数:回溯算法的返回值一般都是void,参数一开始不确定可以等写递归逻辑时进行添加。 3.第二步:确定递归函数的终止条件:当当前集合中的元素大于目标个数时,则将当前集合添加到结果数组中,返回。 4.第三步:确定单次递归函数中的逻辑:需要使用一个参数来控制每次从哪个位置开始,遍历元素,所以在递归函数的参数中添加一个参数来表示每次开始遍历的位置。将当前元素添加到当前集合中,并进行遍递归,并接着将该元素从当前集合中删除,以方便下一个元素进来。 5.本题不是很理解,没有入门,还得进一步理解!!!
本题的完整代码如下:
//第77题. 组合 class Solution1 {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backstrack(n, k, 1);return res; }public void backstrack(int n, int k, int startindex){int d = k - path.size();//使用这个来统计还需要填充的元素数,方便接下来的剪枝操作if(n - startindex + 1 < d ){return;}if(path.size() == k){res.add(new ArrayList<>(path));return;}for(int i = startindex; i <= n; i++){path.add(i);backstrack(n, k, i + 1);path.remove(path.size() - 1);}} }
《代码随想录》回溯算法:组合优化
所谓的组合优化就是进行剪枝,当当前的结果不满足条件时,这个分支就不再继续递归了,及时止损,有利于节省时间。
《代码随想录》回溯算法:组合总和III
本题与第一题很类似,但是还需要进一步理解,完整代码如下:
//216.组合总和III class Solution2{List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum3(int k, int n) {backstrack(k, n, 1);return res;}public void backstrack(int k, int n, int startindex){if(path.size() == k){if(sum == n){res.add(new ArrayList<>(path));}return;} for(int i = startindex; i <= 9; i++){if(sum + i > n){break;}path.add(i);sum += i;backstrack(k, n, i + 1);path.remove(path.size() - 1);sum -= i;}} }
《代码随想录》回溯算法:电话号码的字母组合
本题不会,看了答案也没有看懂,所以还需要后续学习!!!