JPush 极光推送 消息推送 实例
三角形最小路径和 Triangle
数组 动态规划
问题
给定一个三角形,找出自顶向下的最小路径和
。每一步只能移动到下一行中相邻的结点
上。
例如,给定三角形:
[2],
[3,4],
[6,5,7],
[4,1,8,3]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
方法声明:
class Solution {
public int minimumTotal(List<List<Integer>> triangle) { }
}
动态规划(基础)
分析
如果只是简单分析的话,这道题和其他动态规划没啥区别,问题是代码写起来可能稍有点麻烦。
用动态规划分析的关键是发现递推式,我们定义一个二维数组 dp,其中 dp[i][j] 的含义为:
dp[i][j]:到达三角形第 i 行 第 j 那个元素所需要的最小步数
那么我们就可以分析出 dp[i][j] 的值的规律,所以很明显,递推式是这样的:
dp[i][j] = V(i,j) + min(dp[i-1][j-1] ,dp[i-1][j])
当然,针对边界元素我们需要单独处理一下,具体的代码实现如下:
代码
class Solution { public int minimumTotal(List<List<Integer>> triangle) {
int len = triangle.size();
int[][] total = new int[len][len]; //保存的是到达最后一行各个元素的最短距离
total[0][0] = triangle.get(0).get(0); for (int i = 1; i < len; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0) {
total[i][j] = triangle.get(i).get(j) + total[i - 1][j];
} else if (j == i) {
total[i][j] = triangle.get(i).get(j) + total[i - 1][j - 1];
} else {
total[i][j] = triangle.get(i).get(j) + Math.min(total[i - 1][j], total[i - 1][j - 1]);
}
}
} int min = Integer.MAX_VALUE;
for (int i = 0; i < len; i++) {
min = Math.min(min, total[len - 1][i]);
}
System.out.println(Arrays.toString(total[len - 1])); return min;
}
}
时间复杂度 O(n^2)
空间复杂度 O(n^2)
动态规划(逆向)
分析
假如我们是从倒数第二行(统一称为第 i 行)开始走的话,那么从倒数第二行的第 j 个元素走到最后一行所需要的最小步数为:
P(j) = V(i,j) + min(V(i+1,j),V(i+1,j+1))
我们对倒数第二行的所有元素都进行此计算,并将结果保存到集合 array 中,且 array 的第 j 个元素的值为 P(j)。
我们知道 P(j) 代表的含义为倒数第二行的第 j 个元素
走到最后一行
所需要的最小步数,所以如果让我们计算从倒数第二行
走到最后一行
所需要的最小步数,那么我们只需从 array 中选择值最小的那个元素即可。
同样道理,如果让我们从倒数第三行开始走的话,那么我们只需按同样的方式计算从倒数第三行的第 j 个元
素走到 array 列
所需要的最小步数即可,而不需要关注倒数第二行和倒数第三行的数了。
经过此步骤后,我们发现问题的规模变小了,动态规划思想也就体现出来了。
遍历过程:
[2],
[3,4],
[6,5,7],
[4,1,8,3]
[2],
[3,4],
[7,6,10],
[2],
[9,10],
[11]
代码
class Solution { public int minimumTotal(List<List<Integer>> triangle) {
int[][] dp = new int[triangle.size() + 1][triangle.size() + 1];// 加1可以不用初始化最后一层
for (int i = triangle.size() - 1; i >= 0; i--) {
List<Integer> curTr = triangle.get(i);
for (int j = 0; j < curTr.size(); j++) {
dp[i][j] = Math.min(dp[i + 1][j], dp[i + 1][j + 1]) + curTr.get(j);
}
}
return dp[0][0];
}
}
时间复杂度 O(n^2)
空间复杂度 O(n^2)
动态规划(逆向 + 优化)
对于上面那种方式,我们可以继续优化。
我们发现在计算倒数第三行时,array 的长度和倒数第二行的长度相同,且有 替换
倒数第二行的效果,所以,我们可以不必再定义一个 array ,而只需把计算的结果赋给倒数第二行即可。
而在计算过程中,我们需要的 array 的长度会越来越小,这没关系,我们只需要关心自己需要的那些元素即可。
class Solution { public int minimumTotal(List<List<Integer>> triangle) {
int[] dp = new int[triangle.size() + 1]; // 加1可以不用初始化最后一层 for (int i = triangle.size() - 1; i >= 0; i--) {
List<Integer> curTr = triangle.get(i);
for (int j = 0; j < curTr.size(); j++) {
dp[j] = curTr.get(j) + Math.min(dp[j], dp[j + 1]); //这里的dp[j] 使用的时候默认是上一层的,赋值之后变成当前层
}
}
return dp[0];
}
}
时间复杂度 O(n^2)
空间复杂度 O(n)
实际测试会发现,虽然空间复杂度大大降低了,但是总耗时却增加了。这也很好解释,因为时间复杂度并没有变,而空间复杂度减小又是在建立在增加了计算的基础上的,所以总时间当然会增加了。
JPush 极光推送 消息推送 实例的更多相关文章
- ios -- 极光推送《2》--极光推送消息推送成功,但是手机收不到的解决方法
1.确认证书是否与app的Bundle ID是否一致 2. 确认你的推送证书是否已经过期 3.确认你的APP_KEY是否和极光APP_KEY是否一致 4.正确调用bindChannel,并成功返回ap ...
- android热门消息推送横向测评![转]
关于这个话题,已经不是什么新鲜事了.对于大多数中小型公司一般都是选择第三方的服务来实现.但是现在已经有很多提供推送服务的公司和产品,如何选择一个适合自己项目的服务呢?它们之间都有什么差别?在此为大家做 ...
- iOS 消息推送(APNs) 傻瓜式教程
也可以去我的简书页面查看这篇文章 首先: 1.做iOS消息推送需要真机测试 2.做iOS消息推送需要有付费的开发者账号 是否继续看帖? 先学习一下相关的知识吧! 因为中途可能会遇到一些问题,这篇文章或 ...
- iOS开发——消息推送跳转
项目开发用集成是极光推送JPush 这里主要是消息推送过来处理对应界面跳转 同时看到两篇写的不错的相关博客分享一下: http://www.jianshu.com/ ...
- DWR实现服务器向客户端推送消息
原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研 ...
- app消息推送
Mui + 个推 实现消息推送 1.首先去个推 注册一个账号,新建一个消息推送应用 2.配置Mui配置文件 3.使用HBuilder 打包 app 4.然后在到个推后台 发送数据 后台Java代码(官 ...
- 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言
在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret ...
- 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)
这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...
- Android消息推送——JPush极光推送
刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...
随机推荐
- Java简介(1)
起源 略. 组成 Java由四方面组成: 1.Java编程语言 2.Java文件格式 3.Java虚拟机(JVM) 4.Java应用程序接口(Java api) 体系 JavaSE , JavaEE, ...
- extjs之messagebox按钮显示中文
在extjs中我们用到了很多的提示框,但是在对话框按钮上面显示的都是英文的ok.yes.no.cancel,这里给出一个方法,能够使得提示框的按钮文本显示问中文. extjs在加载完成之后会调用页面的 ...
- Bootstrap_排版_标题
Bootstrap和普通的HTML页面一样,定义标题都是使用标签<h1>到<h6>,只不过Bootstrap覆盖了其默认的样式,使用其在所有浏览器下显示的效果一样,具体定义的规 ...
- jQuery放大镜插件jqzoom使用
源码下载,使用指导地址:http://www.mind-projects.it/projects/jqzoom/ 使用教程: 1.导入库文件 <script src="../js/jq ...
- php中const定义常量
const 常量 1.在定义时必须被初始值,2.前面不加任何修饰符3.变量名字母一般都大写4.常量可以被子类继承5.一个常量是属于一个类的,而不是某个对象的 作用:当某些值是固定不变的,就用const ...
- overload and overwrite in C++
1. overload : don't using it in different scope. it will hidden the one in base or global scope. 2. ...
- UVa 10020 - Minimal coverage(区间覆盖并贪心)
Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose the min ...
- DC-DC芯片 同步和異步方式有什么區別
同步方式是集成了High side和Low side MOSFET,組成同步整流模式,可實現高效率,價格相對貴.異步方式只有High side MOSFET;配合外部使用傳統的續流二極管,組成非同步整 ...
- 教你如何用Qt做透明的窗体,setMask, Opacity
// In this function, we can get the height and width of the current widgetvoid Widget::resizeEvent(Q ...
- 199bit总结的影响最大的十个算法
1. 归并排序(MERGE SORT).快速排序(QUICK SORT)和堆积排序(HEAP SORT) 哪个排序算法效率最高?这要看情况.这也就是我把3种算法放在一起讲的原因,可能你更常用其中一种, ...