2.三角形最小路徑和,打家劫舍
阿新 • • 發佈:2021-11-22
三角形最短路徑和,打家劫舍
1.三角形最小路徑和
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.打家劫舍
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]; }