学会从后往前遍历,例 [LeetCode] Pascal's Triangle II,剑指Offer 题4
当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用。这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这些困难。
最直观的一题是 剑指Offer上的面试题 4
另外一道例题,就是LeetCode上的 Pascal's Triangle II
Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle.
For example, given k = 3,
Return [1,3,3,1].
Note:
Could you optimize your algorithm to use only O(k) extra space?
class Solution {
public:
vector<int> getRow(int rowIndex) {
}
};
所谓Pascal's Triangle,就是如下面所示的结构。
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
要求O(k)空间复杂度的情况下,思路很直观,就是先在vector<int> 存入 1,然后循环 k 次。伪代码如下:
for(i = ; i < k; ++i)
{
v[] =
for(j = ; j < k; ++j)
{
v[j] = v[j-] + v[j];
}
}
然而很快我发现这样做是不对的,因为v[j]算出后,紧接着在j+1后的运算中会作为v[j-1]出现,也就是说,v[j-1]此时已经是新值了,不再是上一排的数,算出的结果将是错误的。
只要从v[1]开始往后遍历,都会遇到这个问题。
那么我们改为 v[j] = v[j] + v[j+1],这样确实可以避免值覆盖问题,但是会出现 不得不整体移动数组的麻烦,因为前面算出的值没法放了。
这个时候,如果转而从最后一个值开始算起,逐渐算到v[1],就可以避开这个麻烦。
for(i = ; i < k; ++i)
{
v[k] =
for(j = k-; j > ; --j)
{
v[j] = v[j-] + v[j];
}
v[] = ;
}
代码:
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> v;
if(rowIndex < ) return v;
for(int i = ; i <= rowIndex; ++i){
v.push_back();
}
for(int j = ; j <= rowIndex; ++j){
v[rowIndex] = ;
for(int k = rowIndex-; k > ; --k){
v[k] = v[k] + v[k-];
}
v[] = ;
}
return v;
}
};
Accepted 4ms
学会从后往前遍历,例 [LeetCode] Pascal's Triangle II,剑指Offer 题4的更多相关文章
- 【LeetCode】137. 只出现一次的数字 II(剑指offer 56-II)
137. 只出现一次的数字 II(剑指offer 56-II) 知识点:哈希表:位运算 题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回 ...
- LeetCode: Pascal's Triangle II 解题报告
Pascal's Triangle II Total Accepted: 19384 Total Submissions: 63446 My Submissions Question Solution ...
- LeetCode题解汇总(包括剑指Offer和程序员面试金典,持续更新)
LeetCode题解汇总(持续更新,并将逐步迁移到本博客列表中) LeetCode题解分类汇总(包括剑指Offer和程序员面试金典) 剑指Offer 序号 题目 难度 03 数组中重复的数字 简单 0 ...
- leetcode 338. Counting Bits,剑指offer二进制中1的个数
leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种 ...
- [LeetCode] Pascal's Triangle II 杨辉三角之二
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- [leetcode]Pascal's Triangle II @ Python
原题地址:https://oj.leetcode.com/problems/pascals-triangle-ii/ 题意: Given an index k, return the kth row ...
- LeetCode Pascal's Triangle II (杨辉三角)
题意:给出杨辉三角的层数k,返回最后一层.k=0时就是只有一个数字1. 思路:滚动数组计算前一半出来,返回时再复制另一半.简单但是每一句都挺长的. 0ms的版本: class Solution { p ...
- leetcode:Pascal's Triangle II【Python版】
1.将tri初始化为[1],当rowIndex=0时,return的结果是:1,而题目要求应该是:[1],故将tri初始化为[[1]],返回结果设置为tri[0]即可满足要求: 2.最开始第二层循环是 ...
- LeetCode - Pascal's Triangle II
题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return ...
随机推荐
- 测试报告 之 testNG + Velocity 编写自定义html测试报告
之前用testNG自带的test-outputemailable-report.html,做出的UI自动化测试报告,页面不太好看. 在网上找到一个新的报告编写,自己尝试了一下,埋了一些坑,修改了输出时 ...
- 团队作业7—团队项目设计完善&编码测试
一.根据OOD详细设计工作要点,修改完善团队项目系统设计说明书和详细设计说明. <软件设计方案说明书>Github仓库地址:https://github.com/RNTF6/web 完善内 ...
- Codeforces 837D - Round Subset(dp)
837D - Round Subset 思路:dp.0是由2*5产生的. ①dp[i][j]表示选i个数,因子2的个数为j时因子5的个数. 状态转移方程:dp[i][j]=max(dp[i][j],d ...
- Java中classpath配置
Java中classpath配置 一.DOS常用命令 二.DOS常用命令实例 2.1 转换目录 cd 1.6* 2.2 删除文件 del 删除文件(windows删除从里往外删) del *.txt ...
- javascript之非构造函数的继承
这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是 ...
- Silverlight自定义控件系列 – TreeView (1)
原文路径:http://blog.csdn.net/wlanye/article/details/7265457 很多人都对MS自带的控件不太满意(虽然MS走的是简约风格),都会试图去修改或创建让 ...
- HDU2159二维背包
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Oracle 11g dataguard check real time apply
2017年8月24日 16:38 环境:oracle 11.2.0.1 OEL-5.8 注:以下操作都在备库执行 总结方法: 1.FPYJ(125_7)@fpyj123> select open ...
- Oracle性能诊断艺术-相关脚本说明
第二章 bind_variables.sql 展示怎样绑定变量及何时绑定变量会导致游标共享 bind_variables_peeking.sql 展示绑定变量窥测的优缺点 selectivi ...
- 破解VS