思路分析
回溯算法思路模板:
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
子集题目描述
子集题目解题代码
/**
* @description:
* @author: lilang
* @version:
* @modified By:1170370113@qq.com
*/
public class ListSolution {
//定义返回节点位置
List> solutions = new ArrayList>();
public List> subsets(int[] nums) {
if (nums == null) {
return null;
}
ArrayList ls = new ArrayList<>();
findResluts(nums, 0, ls);
return solutions;
}
private void findResluts(int[] nums, int start, ArrayList integers) {
solutions.add(new ArrayList<>(integers));
for (int i = start; i < nums.length; i++) {
integers.add(nums[i]);
findResluts(nums, i + 1, integers);
integers.remove(integers.size() - 1);
}
}
public static void main(String[] args) {
new ListSolution().subsets(new int[]{1,2,3});
}
}
集合题目描述
集合解题代码
class Solution {
List> combineSolutions = new ArrayList>();
public List> combine(int n, int k) {
ArrayList ls = new ArrayList<>();
findCombineResult(1,n,k, ls);
return combineSolutions;
}
private void findCombineResult(int start,int n,int k, ArrayList integers){
if (integers.size() == k){
combineSolutions.add(new ArrayList<>(integers));
}
for (int i = start; i <= n; i++) {
integers.add(i);
findCombineResult(i + 1, n,k,integers);
integers.remove(integers.size() - 1);
}
}
}
全排列题目描述
全排列解题代码
class Solution {
private List> res = new LinkedList<>();
public List> permute(int[] nums) {
LinkedList tracks = new LinkedList<>();
goCal(nums,tracks);
return res;
}
public void goCal(int[] nums,LinkedList tracks){
if (nums.length == tracks.size()) {
res.add(new LinkedList<>(tracks));
return;
}
for (int num :nums){
if (tracks.contains(num)){
continue;
}
tracks.add(num);
goCal(nums,tracks);
tracks.removeLast();
}
}
}