二叉树根节点到叶子节点的和为指定值的路径
标准的一个dfs加回溯=退出条件+题目要求做的事情+子问题继续dfs+还原,一定要还原
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param sum int整型
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {
// write code here
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
if (root==null){
return result;
}
dfs(result,new ArrayList<>(),root,sum);
return result;
}
private void dfs(ArrayList<ArrayList<Integer>> result,ArrayList<Integer> list,TreeNode root,int sum){
//两个递归条件
if(root==null){
return;
}
if(root.left==null && root.right==null){
//到根节点的和=target的时候就加进去
//但是记得要保持list不变,因为list的改变主要是在后面的代码里?
if(sum-root.val==0){
list.add(root.val);
result.add(new ArrayList<>(list));
list.remove(list.size()-1);
}
return;
}
//加一个根节点然后dfs一下它的左右节点,然后remove掉
list.add(root.val);
dfs(result,list,root.left,sum-root.val);
dfs(result,list,root.right,sum-root.val);
list.remove(list.size()-1);
}
}
有重复项数字的所有排列
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
Arrays.sort(num);
boolean[] flag=new boolean[num.length];
dfs(num,new ArrayList<Integer>(),flag);
return result;
}
public void dfs(int[] num,ArrayList list,boolean[] flag){
int size=list.size();
if(num.length==size){
result.add(new ArrayList<Integer>(list));
return;
}
for(int i=0;i<num.length;i++){
if(flag[i]) continue;
if(i>0 && num[i]==num[i-1] && !flag[i-1]) continue;
list.add(num[i]);
flag[i]=true;
dfs(num,list,flag);
list.remove(size);
flag[i]=false;
}
}
}
…
今天妈妈给我打了一个电话,听到她声音的时候我突然有点后悔,为什么不选一个将就点的国企回去算了呢…有妈妈房子好吃的和好朋友,活得也不会比少那十几万差很多吧…但是那样可能更不知道自己在为什么活着了
哎,好累啊