回溯算法主要用于解决组合,切割,排序,子集,棋盘问题。
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
public List> combine(int n, int k) {List> lists=new ArrayList<>();if(k<=0||n list=new ArrayList<>();backtack(n,k,1,lists,list);return lists;}public void backtracking(int n,int k,int start,List> lists,ArrayList list){if(list.size()==k){lists.add(new ArrayList<>(list));return;}for(int i=start;i<=n;i++){
// if(list.contains(i))
// continue;list.add(i);backtack(n,k,i+1,lists,list);list.remove(list.size()-1);}}
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
public List> combinationSum2(int[] candidates, int target) {List> lists=new ArrayList<>();List list=new ArrayList<>();Arrays.sort(candidates);backtracking(lists,list,target,candidates,0);return lists;}public void backtracking(List> lists,List list,int target,int[] candidates,int start){Integer collect = list.stream().collect(Collectors.summingInt(Integer::intValue));if(collect==target) {lists.add(new ArrayList<>(list));return;}if(collect>target)return;for(int i=start;itarget)continue;//同一层数值相同,需要剪掉,不然会造成重复if(i > start && candidates[i] == candidates[i-1]){continue;}list.add(candidates[i]);backtracking(lists,list,target,candidates,i+1);list.remove(list.size()-1);}}
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
输入:k = 3, n = 7 输出: [[1,2,4]] 解释: 1 + 2 + 4 = 7 没有其他符合的组合了。
public List> combinationSum3(int k, int n) {List> lists=new ArrayList<>();List list=new ArrayList<>();int[] array=new int[]{1,2,3,4,5,6,7,8,9};int sum = Arrays.stream(array).limit(k).sum();if(sum>n)return lists;tracking(lists,list,k,n,0,array);return lists;}public void tracking(List> lists,List list,int k,int n,int start,int[] array){int sum = list.stream().mapToInt(Integer::intValue).sum();if(sum==n&&list.size()==k){lists.add(new ArrayList<>(list));return;}if(sum>n||list.size()>k)return;for(int i=start;in)continue;list.add(array[i]);tracking(lists,list,k,n,i+1,array);list.remove(list.size()-1);}}
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
public List> permute(int[] nums) {List> lists=new ArrayList<>();if(nums.length==0)return lists;ArrayList list=new ArrayList<>();backtracking(lists,list,nums);return lists;}public void backtracking(List> lists,ArrayList list,int[] nums){if(list.size()==nums.length){lists.add(new ArrayList<>(list));return;}for(int i=0;i
下一篇:<Linux>进程概念