112.路径总和
路径总和题目链接
public boolean hasPathSum(TreeNode root, int sum) {
boolean flag = false;
if(root==null){
return flag;
}
TreeNode p = root;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(p);
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0;i<size;i++){
TreeNode treeNode = queue.poll();
int length = treeNode.val;
if(length==sum&&treeNode.left==null&&treeNode.right==null){
flag = true;
break;
}
if(treeNode.left!=null){
treeNode.left.val +=length;
queue.offer(treeNode.left);
}
if(treeNode.right!=null){
treeNode.right.val+=length;
queue.offer(treeNode.right);
}
}
}
return flag;
}
113.路径总和 II
路径总和 II题目链接
List<List<Integer>> results;
public List<List<Integer>> pathSum(TreeNode root, int sum) {
results = new ArrayList<>();
if(root==null){
return results;
}
List<Integer> list = new ArrayList<>();
list.add(root.val);
dfs(root,list,sum,root.val);
return results;
}
public void dfs(TreeNode root,List<Integer> list,int sum,int cur){
if(root.left==null&&root.right==null){
if(cur==sum){
results.add(new ArrayList<>(list));
}
return;
}
if(root.left!=null){
list.add(root.left.val);
dfs(root.left,list,sum,cur+root.left.val);
list.remove(list.size()-1);
}
if(root.right!=null){
list.add(root.right.val);
dfs(root.right,list,sum,cur+root.right.val);
list.remove(list.size()-1);
}
}
118.杨辉三角
杨辉三角题目链接
List<List<Integer>> results;
public List<List<Integer>> generate(int numRows) {
results = new ArrayList<>();
if(numRows<1){
return results;
}
List<Integer> list;
List<Integer> old = new ArrayList<>();
old.add(1);
results.add(old);
for(int i=1;i<numRows;i++){
list = new ArrayList<>();
for(int j=0;j<=i;j++){
if(j==0||j==i){
list.add(1);
}else{
list.add(old.get(j)+old.get(j-1));
}
}
results.add(list);
old = list;
}
return results;
}
119.杨辉三角II
三角形最小路径和题目链接
- 注意这里为什么第二个for循环要倒着算。因为从前到后,前面的值会被覆盖掉,从而影响到同行后面数的计算
public List<Integer> getRow(int rowIndex) {
Integer [] a = new Integer[rowIndex+1];
a[0]=1;
for(int i=1;i<=rowIndex;i++){
for(int j=i;j>=0;j--){
if(j==0||j==i){
a[j]=1;
}else{
a[j]=a[j-1]+a[j];
}
}
}
return Arrays.asList(a);
}
120.三角形最小路径和
三角形最小路径和题目链接
public int minimumTotal(List<List<Integer>> triangle) {
int min = Integer.MAX_VALUE;
if(triangle==null||triangle.size()==0){
return 0;
}
int [] [] dp = new int[triangle.size()][triangle.get(triangle.size()-1).size()];
for(int i=0;i< triangle.size();i++){
for(int j=0;j<triangle.get(i).size();j++){
if(i==0&&j==0){
dp[i][j] = triangle.get(i).get(j);
continue;
}
if(j==0){
dp[i][j] = dp[i-1][j]+triangle.get(i).get(j);
continue;
}
if(j==triangle.get(i).size()-1){
dp[i][j] = dp[i-1][j-1]+triangle.get(i).get(j);
continue;
}
dp[i][j] = Math.min(dp[i-1][j], dp[i-1][j-1]) + triangle.get(i).get(j);
}
}
for(int j=0;j<triangle.get(triangle.size()-1).size();j++){
min = Math.min(min,dp[triangle.size()-1][j]);
}
return min;
}
public int minimumTotal(List<List<Integer>> triangle) {
int size = triangle.size();
int [] dp = new int[size+1];
for(int i=triangle.size()-1;i>=0;i--){
for(int j=0;j<=i;j++){
dp[j]=triangle.get(i).get(j) + Math.min(dp[j],dp[j+1]);
}
}
return dp[0];
}