LeetCode 刷题【119. 杨辉三角 II、120. 三角形最小路径和】
119. 杨辉三角 II
自己做
解:双重for循环
class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> res = Arrays.asList(1); //结果for(int level = 1; level <= rowIndex; level++){List<Integer> rank = new ArrayList(); //当前行int left, right;for(int j = 0; j <= level; j++){//左上角元素if(j == 0) //在开头就是0 + 1,left = 0left = 0;else //离开了开头就根据上层的元素开始计算,left = res.get(level - 1).get(i)left = res.get(j - 1);//右上角元素if(j == level) //在末尾就是1 + 0,right = 0right = 0;else //离开了开头就根据上层的元素开始计算,right = res.get(level - 1).get(j)right = res.get(j);rank.add(left + right); //加入该行结果}res = rank;}return res;}
}
120. 三角形最小路径和
自己做
解:动态规划
class Solution {public int minimumTotal(List<List<Integer>> triangle) {int len = triangle.size();for(int i = 1; i < len; i++)//根据上层元素进行计算路径for(int j = 0; j < triangle.get(i).size(); j++){int left = Integer.MAX_VALUE, up = Integer.MAX_VALUE;if(j == 0) //左边第一个元素只能从上层的正对元素抵达up = triangle.get(i - 1).get(j);else if(j == triangle.get(i).size() - 1) //右边最后一个元素只能从上层的左侧元素抵达left = triangle.get(i - 1).get(j - 1);else{ //其余情况两边都能抵达up = triangle.get(i - 1).get(j);left = triangle.get(i - 1).get(j - 1);}triangle.get(i).set(j, Integer.min(up, left) + triangle.get(i).get(j));}int min = triangle.get(len - 1).get(0);for(int i = 1; i < len; i++)if(min > triangle.get(len - 1).get(i))min = triangle.get(len - 1).get(i);return min;}
}
看题解
原来是直接用list开销更大,不过我这使用O(1)的空间为什么内存消耗才超60%,海油糕寿?!
class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n = triangle.size();int[][] f = new int[n][n];f[0][0] = triangle.get(0).get(0);for (int i = 1; i < n; ++i) {f[i][0] = f[i - 1][0] + triangle.get(i).get(0);for (int j = 1; j < i; ++j) {f[i][j] = Math.min(f[i - 1][j - 1], f[i - 1][j]) + triangle.get(i).get(j);}f[i][i] = f[i - 1][i - 1] + triangle.get(i).get(i);}int minTotal = f[n - 1][0];for (int i = 1; i < n; ++i) {minTotal = Math.min(minTotal, f[n - 1][i]);}return minTotal;}
}