120.Triangle:修订间差异
小 Riguz moved page LeetCode:120.Triangle to 120.Triangle without leaving a redirect |
标签:已被回退 |
||
第38行: | 第38行: | ||
==2D DP== | ==2D DP== | ||
It works, but not good, especially memory. | It works, but not good, especially memory. | ||
{{Submission|runtime= | {{Submission|runtime=799ms|memory=40.97MB|rp=5|mp=96.60}} | ||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
class Solution { | class Solution { | ||
public int | public int numberOfBoomerangs(int[][] points) { | ||
int sum = 0; | |||
for(int i = 0; i < points.length; i++) { | |||
int | for(int j = i + 1; j < points.length; j++) { | ||
for( int k = j + 1; k < points.length; k++) { | |||
for(int i | if(distance(points, i, j) == distance(points, i, k)) | ||
sum += 2; | |||
for(int j = | if(distance(points, j, i) == distance(points, j, k)) | ||
sum += 2; | |||
if(distance(points, k, i) == distance(points, k, j)) | |||
sum += 2; | |||
} | } | ||
} | } | ||
} | } | ||
return | return sum; | ||
} | |||
private static int distance(int[][] points, int i, int j) { | |||
int l = points[i][0] - points[j][0]; | |||
int w = points[i][1] - points[j][1]; | |||
return l * l + w * w; | |||
} | } | ||
} | } |
2024年1月17日 (三) 15:52的版本
Description
#120 | Triangle | Medium | ||
---|---|---|---|---|
Dynamic Programming | Top 150 | |||
Given a triangle array, return the minimum path sum from top to bottom. |
For each step, you may move to an adjacent number of the row below. More formally, if you are on index i on the current row, you may move to either index i or index i + 1 on the next row.
Example 1:
Input: triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
Output: 11
Explanation: The triangle looks like:
2
3 4
6 5 7
4 1 8 3
The minimum path sum from top to bottom is 2 + 3 + 5 + 1 = 11 (underlined above).
Example 2:
Input: triangle = [[-10]]
Output: -10
Solution
2D DP
It works, but not good, especially memory.
Runtime 799ms |
|
Memory 40.97MB |
|
class Solution {
public int numberOfBoomerangs(int[][] points) {
int sum = 0;
for(int i = 0; i < points.length; i++) {
for(int j = i + 1; j < points.length; j++) {
for( int k = j + 1; k < points.length; k++) {
if(distance(points, i, j) == distance(points, i, k))
sum += 2;
if(distance(points, j, i) == distance(points, j, k))
sum += 2;
if(distance(points, k, i) == distance(points, k, j))
sum += 2;
}
}
}
return sum;
}
private static int distance(int[][] points, int i, int j) {
int l = points[i][0] - points[j][0];
int w = points[i][1] - points[j][1];
return l * l + w * w;
}
}
1D DP
Runtime 2ms |
|
Memory 43.61MB |
|
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
// 可以直接用 triangle.size();
int maxRowSize = triangle.get(triangle.size() -1).size();
// 只需要记录上一次的最短路径
int[] dp = new int[maxRowSize];
for(int i = triangle.size() -1; i >=0; i--) {
List<Integer> row = triangle.get(i);
for(int j = 0; j < row.size(); j++) {
if(i < dp.length -1) {
// 从左到右更新,正好计算右边的元素时,当前的值已经不需要用到了。所以可以直接更新
dp[j] = Math.min(dp[j], dp[j+1]) + row.get(j);
} else {
dp[j] = row.get(j);
}
}
}
return dp[0];
}
}
2D DP +DFS
Runtime 1ms |
|
Memory 44.49MB |
|
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int[][]dp = new int[triangle.size()][triangle.size()];
for(int[]temp: dp)
Arrays.fill(temp, Integer.MAX_VALUE);
return find(triangle, 0, 0, dp);
}
private int find(List<List<Integer>>triangle, int i, int j, int[][]dp) {
if(i == triangle.size())
return 0;
if(dp[i][j] != Integer.MAX_VALUE)
return dp[i][j];
int current = triangle.get(i).get(j);
int a = current + find(triangle, i+1, j, dp);
int b = current + find(triangle, i+1, j+1, dp);
return dp[i][j] = Math.min(a, b);
}
}