Leetcode刷题之路(111-120)

112.路径总和

路径总和题目链接

  • 同样bfs思想
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题目链接

  • 记录路径的话那利用dfs了
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.三角形最小路径和

三角形最小路径和题目链接

  • 比较简单类的dp题,首先第一种方法就是二维数组
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];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值