[leetcode 120]triangle 空间O(n)算法
1 题目
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.
2 思路
这是一个动态规划题,每行的数据数对应行数,设F[m,n]表示到达第m行,第n列的最小代价,那么有
F[m,n]=min{F[i-1,j]+b,F[i-1,j-1]+b},其中b为第m行,第n列的数
那么边界值怎么处理呢?
我是设置正常值从1开始,0和最后一个值的后一位为IntMax。
这道题是我自己想出来的。
3 代码
①空间O(n^2),第一次想到的是这个
public int minimumTotal(List<List<Integer>> triangle){
int lineNumber = triangle.size();
Integer[][] F = new Integer[lineNumber][lineNumber+2];
//F(a,b) = min{F(a-1,b-1)+b,F(a-1,b)+b} F(a,b)表示 第a行第b个的最小代价
//set F(a,0) to MAX, F(a,B) to MAX , where B = triangle.get(a).size()+1, 0<=a<lineNumber;
//set the initial value F[0][1] = triangle.get(0).get(0);
for (int i = 0; i < lineNumber; i++) {
F[i][0] = Integer.MAX_VALUE;
int lineSize = triangle.get(i).size() + 1;
F[i][lineSize] = Integer.MAX_VALUE;
}
// long former = 0;
//dynamic programming
for (int i = 1; i < lineNumber; i++) {
List<Integer> row = triangle.get(i);
int rowSize = row.size();
for (int j = 1; j <= rowSize; j++) {
F[i][j] = Math.min(F[i-1][j-1], F[i-1][j]) + row.get(j-1);
}
} int min = F[lineNumber-1][1];
for (int i = 1; i <= lineNumber; i++) {
int temp = F[lineNumber-1][i];
if(temp < min){
min = temp;
}
} return min;
}
②空间o(n),改进了一下
public int minimumTotal2(List<List<Integer>> triangle){
int lineNumber = triangle.size();
Integer[][] F = new Integer[2][lineNumber+2];
//F(a,b) = min{F(a-1,b-1),F(a-1,b)} + b; F(a,b)represent the minValue of the a row b list //set the initial value and the boundary value
F[0][0] = Integer.MAX_VALUE;
F[0][1] = triangle.get(0).get(0);
F[0][2] = Integer.MAX_VALUE; //dynamic programming
for (int i = 1; i < lineNumber; i++) {
List<Integer> row = triangle.get(i);
int rowSize = row.size();
for (int j = 1; j <= rowSize; j++) {
F[1][j] = Math.min(F[0][j-1], F[0][j]) + row.get(j-1);
}
F[1][0] = Integer.MAX_VALUE;
F[1][rowSize+1] = Integer.MAX_VALUE;
for (int j = 0; j <= rowSize+1; j++) {
F[0][j] = F[1][j];
}
} int min = F[lineNumber > 1 ? 1 : 0][1];
for (int i = 1; i <= lineNumber; i++) {
int temp = F[lineNumber > 1 ? 1 : 0][i];
if(temp < min){
min = temp;
}
} return min;
}
[leetcode 120]triangle 空间O(n)算法的更多相关文章
- LeetCode 120. Triangle (三角形)
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- LeetCode 120. Triangle (三角形最小路径和)详解
题目详情 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径 ...
- LeetCode 120. Triangle三角形最小路径和 (C++)
题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...
- LeetCode - 120. Triangle
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- leetcode 120 Triangle ----- java
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- [LeetCode] 120. Triangle _Medium tag: Dynamic Programming
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- Java for LeetCode 120 Triangle
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- [leetcode] 120. Triangle (Medium)
原题 思路: dp,从下往上依次取得最小的,取到最上面的,就是一条最小的路径. class Solution { public: int minimumTotal(vector<vector&l ...
- [leetcode]120.Triangle三角矩阵从顶到底的最小路径和
Given a triangle, find the minimum path sum from top to bottom.Each step you may move to adjacent nu ...
随机推荐
- 【SpringAop】【统一日志处理】注解方式理解以及使用
[注意:本次代码的demo会存在百度网盘,由于公司的保密,禁止上传,所以仅本人可见] 目前公司在做数据资产项目,数据质量部分使用到了springaop做统一日志处理,以前对这块有了解,有点模糊不清,今 ...
- 基于内存,redis,mysql的高速游戏数据服务器设计架构 ZT
zt http://www.cnblogs.com/captainl1993/p/4788236.html 1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和 ...
- springboot server.address 配置问题
1. server.address 为对应机器ip地址时 ,如 18.10.x.x 此时访问该服务只能使用 ip 访问 . 2. 配置为 127.0.0.1 时 可以使用 localhost 和 ...
- oracle银行卡卡号计算函数
create or replace function GetCardNoBySerialNo(v_sysacc varchar2,v_position number) return varchar2 ...
- javascript声明对象时 带var和不带var的区别
2015/11/25补充: 关于变量声明这里有详细的解释: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Stat ...
- 各种 on事件触发js代码
[转]各种 on事件触发js代码 1.onmouseenter:当鼠标进入选区执行代码 <div style="background-color:red" onmouseen ...
- Linux常见目录使用区别
/bin 在有的Unix和Linux系统中是/usr/bin的链接,不过UBuntu系统是两个独立的目录./bin 存放系统管理员和普通用户都要使用的程序. /sbin 存放用于系统恢复,系统启动,系 ...
- clion中资源文件以及头文件的引用
首先在使用clion中没有将文件target就会出现下面的错误 在使用的时候可以默认一下 在以后的使用中如果不需要某个文件时 就可以在CMakeLis.txt文件把它删除掉 在代码界面的最上面出 ...
- 1-10假期训练(hdu-2059 简单dp)
题目一:传送门 思路:水题,模拟即可 题目二:传送门 思路:dp,决策每个充电站是否要充电.(决策只有搜索,DP两种解决方法) (1)考虑状态的个数,n+2个,因为除了n个还有位置0,终点len两种状 ...
- 在vue中没有数据的渲染方法
1.例如在评论区中,评论一般分为两种形式,一种是有评论,一种是没有评论, 用v-if进行判断,判断的是评论的长度,此时评论的数据应为数组 2.可以computed中记性计算后进行数据的返回在用v-if ...