[leetcode 문제풀이 노트] 트라이앵글.
8872 단어 LeetCode
For example, given the following triangle
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
The minimum path sum from top to bottom is
11
(i.e., 2 + 3 + 5 + 1 = 11). Note:Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.
문제: 전형적인 동적 기획에서 시작된 생각은 2차원수 그룹sum,sum[i][j]로 첫 번째 줄의 첫 번째 열에서 (i,j) 얻은 최소한의 합을 나타낸다.그럼sum[i,j]=triangle[i,j]+sum[i-1,j-1](아래 표의 경계를 넘어 판단하는 것을 주의).마지막으로sum의 마지막 줄에서 가장 작은 요소를 되돌려줍니다.
코드는 다음과 같습니다.
1 public class Solution {
2 public int minimumTotal(List<List<Integer>> triangle) {
3 if(triangle == null || triangle.size() == 0)
4 return 0;
5
6 int length = triangle.size();
7 int[][] sum = new int[length][length];
8
9 for(int i = 0;i < triangle.get(0).size();i++)
10 sum[0][i]= triangle.get(0).get(i);
11
12 for(int i = 1;i < length;i++){
13 for(int j = 0;j < triangle.get(i).size();j++){
14 int left = j-1>=0?sum[i-1][j-1]:Integer.MAX_VALUE;
15 int middle = j>triangle.get(i).size()-2?Integer.MAX_VALUE:sum[i-1][j];
16
17 sum[i][j] = triangle.get(i).get(j) + Math.min(left, middle);
18 }
19 }
20
21 int answer = Integer.MAX_VALUE;
22 for(int i = 0;i < triangle.get(length-1).size();i++)
23 answer = Math.min(answer, sum[length-1][i]);
24
25 return answer;
26 }
27 }
상술한 해법은 O(n2)의 공간 복잡도이다. 실제로 현재 줄sum를 계산할 때 우리는 이전 줄의sum값만 사용하기 때문에 우리는 이전 줄의 원소의sum값만 저장할 수 있다.그러나 한 가지 주의해야 할 것은 만약sum를 직접 1차원수조로 낮추고 왼쪽에서 오른쪽으로 순서대로 sum를 계산하는 것은 정확하지 않다는 것이다.예를 들면 다음과 같다.
[
[-1],
[-2,-3],
]
두 번째 줄을 계산할 때sum=[-1,0], 원소-2에 대응하는sum를 계산할 때sum는 [-3,0]로 업데이트된다. 그러면 -3에 대응하는sum를 계산할 때 필요한 이전 줄의 원소에 대응하는-1을 잃어버리면 -3에 대응하는sum가 -6인 오류 결과를 얻게 된다.그래서 우리가 현재 행 원소를 계산할 때 뒤에서 앞으로 계산하려면 다음 원소를 계산하는 데 사용할 데이터를 잃어버리지 않을 것이다.
마지막 공간 복잡도가 O(n)인 코드는 다음과 같습니다.
1 public class Solution {
2 public int minimumTotal(List<List<Integer>> triangle) {
3 if(triangle == null || triangle.size() == 0)
4 return 0;
5
6 int length = triangle.size();
7 int[] sum = new int[length];
8
9 for(int i = 0;i < triangle.get(0).size();i++)
10 sum[i]= triangle.get(0).get(i);
11
12 for(int i = 1;i < length;i++){
13 for(int j = triangle.get(i).size()-1;j>=0;j--){
14 int left = j-1>=0?sum[j-1]:Integer.MAX_VALUE;
15 int middle = j>triangle.get(i).size()-2?Integer.MAX_VALUE:sum[j];
16
17 sum[j] = triangle.get(i).get(j) + Math.min(left, middle);
18 }
19 }
20
21 int answer = Integer.MAX_VALUE;
22 for(int i = 0;i < triangle.get(length-1).size();i++)
23 answer = Math.min(answer, sum[i]);
24
25 return answer;
26 }
27 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.