学习计划算法: 第十二天

153 阅读1分钟

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意: 给定 n 是一个正整数。

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

leetcode-cn.com/problems/cl…

class Solution {
    public int climbStairs(int n) {

        if(n <=1){
            return n;
        }

        int[] arr = new int[n];
        arr[0] =1;
        arr[1] = 2;
        for(int i=2; i< n;i++){
            arr[i] = arr[i-1] +arr[i-2];
        }  
        return arr[n-1];
    }
}

打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4
输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12
class Solution {
    public int rob(int[] nums) {
        if(nums.length < 3){
            int max = 0;
            for(int i=0;i<nums.length; i++){
                if(max < nums[i]){
                    max = nums[i];
                }
            }
            return max;
        }

        int[] sum = new int[nums.length];
        sum[0] = nums[0];
        sum[1] = nums[1];
        sum[2] = (nums[0]+ nums[2]) > nums[1] ?  (nums[0]+ nums[2]): nums[1];

        if(nums.length > 3){
            for(int i=3; i<nums.length; i++){
                int sumi  = (sum[i-2]> sum[i-3]? sum[i-2]:sum[i-3]) + nums[i];
                if(sumi< sum[i-1]){
                    sumi = sum[i-1];
                }
                sum[i] = sumi;
            } 
        }
        return sum[nums.length-1];
    }
}

三角形最小路径和

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
   2
  3 4
 6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
输入: triangle = [[-10]]
输出: -10

  提示:

& 1 <= triangle.length <= 200

  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • -104 <= triangle[i][j] <= 104  
class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        
        if(triangle.size() ==1){
            return triangle.get(0).get(0);
        }
       Integer min = Integer.MAX_VALUE;
        for(int i=1; i<triangle.size(); i++){
            for(int j=0; j< triangle.get(i).size(); j++){
                if(j == 0){
                    triangle.get(i).set(j, triangle.get(i).get(j)+ triangle.get(i-1).get(j));
                    if(i== triangle.size()-1 && min > triangle.get(i).get(j)){
                        min =  triangle.get(i).get(j);
                    }
                    continue;
                }
                if(j == triangle.get(i).size() -1){
                    triangle.get(i).set(j, triangle.get(i).get(j)+ triangle.get(i-1).get(j-1));
                    if(i== triangle.size()-1 && min > triangle.get(i).get(j)){
                        min =  triangle.get(i).get(j);
                    }
                    continue;
                }
                int sum =triangle.get(i-1).get(j);
                if(triangle.get(i-1).get(j) > triangle.get(i-1).get(j-1)){
                    sum = triangle.get(i-1).get(j-1);
                }
                triangle.get(i).set(j, triangle.get(i).get(j)+ sum);
                if(i== triangle.size()-1 && min > triangle.get(i).get(j)){
                    min =  triangle.get(i).get(j);
                }
            }
        }
        return min;
    }
}