前言
仅记录学习笔记,如有错误欢迎指正。
题目
全排列(给定一个没有重复数字的序列,返回其所有可能的全排列。)示例
- 输入: nums = [1,2,3]
- 输出: [
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解法
public List<List<Integer>> permute(int[] num){
List<List<Integer>> res = new ArrayList<>();
List<Integer> track = new ArrayList<>();
dfsNew(num,track,res);
return res;
}
public void dfsNew(int[] num, List<Integer> track, List<List<Integer>> res){
//判断是不是到最后了
if(track.size()==num.length){
res.add(new ArrayList<>(track));
}else{
for(int i =0;i<num.length;i++){
//决策树中已经存在不能再次选择
if(track.contains(num[i])){
continue;
}
track.add(num[i]);
//进入下一步决策
dfsNew(num,track,res);
//取消选择 移出最后一位
track.remove(track.size()-1);
}
}
}
题目
组合问题 给定两个数字n,k,算法输出[1,n]中k个数字的所有组合示例
- 输入:n=4 k=2
- 输出: [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
解法
List<List<Integer>> res1 = new ArrayList<>();
public List<List<Integer>> combine(int n,int k) {
List<Integer> track = new ArrayList<>();
dfs1(n,k,1,track);
return res1;
}
private void dfs1(int n,int k , int start, List<Integer> track) {
if(track.size()==k){
res1.add(new ArrayList<>(track));
return;
}
for(int i = start;i<=n;i++){
if(!track.isEmpty() && i <= track.get(0)){
continue;
}
if(track.size()==0 && i==n){
break;
}
track.add(i);
dfs1(n,k,start+1,track);
track.remove(track.size()-1);
}
}
题目
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例
- 输入: {10,5,12,4,7},22
- 输出: [[10,5,7],[10,12]]
解法
太久没写果然生疏了,不过思路肯定是dfs,一步一步遍历,不符合条件就退回。 import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> res =new ArrayList<>();
ArrayList<Integer> trace = new ArrayList<>();
dfs(root,target,res,trace);
return res;
}
private void dfs(TreeNode root,int target,ArrayList<ArrayList<Integer>> res,
ArrayList<Integer> trace ) {
if(root == null) return;
//加入路径
trace.add(root.val);
target -= root.val;
//判断是否满足要求
if(target == 0 && root.left == null && root.left == null){
res.add(new ArrayList(trace));
}
//递归
dfs(root.left,target,res,trace);
dfs(root.right,target,res,trace);
//删除不满足要求的
trace.remove(trace.size()-1);
}
}