1. 程式人生 > 其它 >2.三角形最小路徑和,打家劫舍

2.三角形最小路徑和,打家劫舍

三角形最短路徑和,打家劫舍

1.三角形最小路徑和

https://leetcode-cn.com/problems/triangle/

     public int minimumTotal(List<List<Integer>> list) {
            // 初始化陣列長度為:最低層陣列的長度
            int[] A = new int[list.get(list.size() - 1).size() + 1];
            // 最底層開始
            for (int i = list.size() - 1; i >= 0; i--) {
                for (int j = 0; j < list.get(i).size(); j++) {
                    // 第一次迴圈:初始化最底層,之後逐層向上累加
                    A[j] = Math.min(A[j], A[j + 1]) + list.get(i).get(j);
                }
            }
            return A[0];
     }

2.打家劫舍

https://leetcode-cn.com/problems/house-robber/

    public int rob(int[] nums) {
        int n = nums.length;
        if (n == 0 || nums == null) {
            return 0;
        }
        // 每個房屋都可以選擇偷或者不偷: 定義二維陣列,第二維度表示狀態
        int[][] a = new int[n][2];
        // 第一個房屋不偷
        a[0][0] = 0;
        // 第一個房屋偷
        a[0][1] = nums[0];
        for (int i = 1; i < n; i++) {
            // 狀態迭代,不偷當前房屋,選擇上一個房屋(偷或者不偷)的最大值
            a[i][0] = Math.max(a[i - 1][0], a[i - 1][1]);
            // 偷當前房屋,上一個房屋只能不偷
            a[i][1] = a[i - 1][0] + nums[i];
        }
        return Math.max(a[n - 1][0], a[n - 1][1]);
    }

    > 優化
    public int rob(int[] nums) {
        int n = nums.length;
        if (n == 0 || nums == null) {
            return 0;
        }
        if (n == 1) {
            return nums[0];
        }
        // a[i]表示前i個屋子所偷金額達到的最大值
        int[] a = new int[n];
        a[0] = nums[0];
        a[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < n; i++) {
            // 不偷當前房屋,前i-1個屋子所偷金額達到的最大值
            // 偷當前房屋,(i - 1)個房屋只能不偷,(i - 2) 個房屋必偷
            a[i] = Math.max(a[i - 1], a[i - 2] + nums[i]);
        }
        return a[n - 1];
    }