新博文地址:[leetcode]Triangle
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
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.
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.
求三角形从上到下的最短路径,最好能将空间复杂度达到O(n),这道题有两种做法:
一种是破坏原数组,这样就不需要额外空间
另一种是保留原数组,需要O(n)空间,无论哪一种都满足题中对空间复杂度的要求。
我的算法是,用一个数组记录从根节点到第 i 层的所有节点的路径,从而选出最短路径。需要O(n)空间,代码较长。
public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) { if (triangle == null || triangle.size() == 0) { return 0; } int size = triangle.size(); int[] path = new int[triangle.get(size - 1).size()]; path[0] = triangle.get(0).get(0); int[] cpyPath = Arrays.copyOf(path, path.length);//两个一位数组切换 for (int j = 1; j < triangle.size(); j++) { ArrayList<Integer> list = triangle.get(j); for (int i = 0; i < list.size(); i++) { if (i == 0) { cpyPath[0] = path[0] + list.get(0); } else if (i == list.size() - 1) { cpyPath[i] = list.get(list.size() - 1) + path[list.size() - 2]; } else { int min = path[i - 1] < path[i] ? path[i - 1] : path[i]; cpyPath[i] = list.get(i) + min; } } path = Arrays.copyOf(cpyPath, cpyPath.length); } int result = Integer.MAX_VALUE; for (Integer tem : path) { if (tem < result) { result = tem; } } return result; }
可以看出,上面的算法是自顶向下的。
另一种做法是自底向上,破坏了数组内容,但是代码非常简练,而且无需考虑边界条件,真心赞
public int bottomUp(ArrayList<ArrayList<Integer>> triangle) { for(int i = triangle.size() - 2; i >= 0; i--){ for(int j = 0; j < triangle.get(i).size(); j++){ triangle.get(i).set(j, triangle.get(i).get(j) + Math.min(triangle.get(i + 1).get(j), triangle.get(i + 1).get(j + 1))); } } return triangle.get(0).get(0); }
但是有人说这是DP问题,可能是我对DP不太熟练,总认为这并不是DP问题,因为它连DP问题最基本的“最优子结构”都不满足。例如
[2],
[3,1],
[6,5,11]
三层结构时,毫无疑问是2,3,5,但是两层时,应该是2,1。而且DP问题的求解顺序也应该是由子问题递推求出原问题。回头再研究研究DP。如果我理解错了,请大家指正
相关推荐
python python_leetcode题解之120_Triangle
java java_leetcode题解之Largest Triangle Area.java
javascript js_leetcode题解之120-triangle.js
# [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...
python python_leetcode题解之118_Pascal's_Triangle
python python_leetcode题解之119_Pascal's_Triangle_II
javascript js_leetcode题解之118-pascal's-triangle.js
《LeetCode-Triangle:深入解析Java解题策略》 在编程世界中,LeetCode是一个备受推崇的在线平台,它提供了一系列的算法题目,帮助开发者提升编程技能和算法理解能力。"Triangle"是LeetCode中的一道经典问题,涉及...
javascript js_leetcode题解之119-pascal's-triangle-II.js
- **Pascal's Triangle**:生成帕斯卡三角形的某一行。 - **Merge Sorted Array**:合并两个已排序的数组,使合并后的数组仍然有序。 - **Sum**:计算数组的总和。 - **Find Minimum in Rotated Sorted Array**...
* Pascal's Triangle:给定一个整数 n,返回帕斯卡三角形的前 n 行。这个题目需要使用动态规划的思想,首先初始化一个二维数组,然后遍历数组,并将每个元素设置为其左上和右上的和。 * Merge Sorted Array:给定两...
在IT领域,尤其是在编程和算法学习中,LeetCode是一个非常受欢迎的在线平台,它提供了大量的编程挑战题目,帮助开发者提升技能并准备面试。本压缩包“Java-Leetcode-杨辉三角.zip”显然聚焦于Java语言解决LeetCode上...
Pascal's Triangle v. Merge Sorted Array vi. Sum vii. Find Minimum in Rotated Sorted Array viii. Largest Rectangle in Histogram ix. Maximal Rectangle x. Palindrome Number xi. Search a 2D Matrix xii. ...
LeetCode是一个在线平台,提供各种编程题目,帮助程序员提升算法技能,而这个题目就是其中的一个经典问题。 三角形最小路径和的问题描述如下:给定一个三角形,每个顶点都有一个非负整数,目标是找到一条从顶部到...
Triangle 2020-01-15 213 House Robberll -变种 198 337 2020-01-16 139 单词拆分 2020-01-20 104 树 -变种 111 2020-01-21 129 Sum root to leaf numbers 2020-01-22 226 翻转二叉树 2020-01-23 95 不同的二叉搜索...
LeetCode是一个在线平台,它提供了大量的编程题目,旨在帮助程序员提升算法能力和技术实力,尤其对于准备求职面试的开发者来说,LeetCode是不可或缺的资源。本题解将深入探讨LeetCode中的第118题——“杨辉三角”。 ...
leetcode 力扣_实践 标签: leetcode 我的 LeetCode 练习从 2020 年开始 前言 尝试将 Leetcode 作为我的日常练习。 将更新带有解释的解决方案。 大批 27_Remove_element 26_Remove_Duplicates 80_Remove_Duplicates_...
在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第120题,名为“三角形最小路径和”。这是一道经典的动态规划问题,经常出现在IT行业的求职面试中,尤其是对于那些希望在软件开发或者...
这段代码展示了如何用Java编程语言有效地解决LeetCode上的Pascal's Triangle问题。它利用了杨辉三角的递归性质,通过迭代而非递归的方式降低了复杂性,使得算法的效率更高。同时,代码结构清晰,易于理解,是学习...
Triangle Given two sorted integer arrays A and B, merge B into A as one sorted array.Note: You may assume that A has enough space (size that is greater or equal to m + n)to hold additional elements ...