当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用。这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这些困难。

最直观的一题是 剑指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

最新文章

  1. AlloyRenderingEngine之Shape
  2. InstallShield如何做Excel安装与否的检测
  3. MFC-01-Chapter01:Hello,MFC---1.2 MFC简介
  4. AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示
  5. 计算器&lt;代码&gt;
  6. mongodb不同版本之间有很大的差异
  7. Python IDE Tools
  8. c# spring aop的简单例子
  9. HttpWebRequest和HttpWebResponse
  10. Linux 进程管理剖析--转
  11. ECharts的使用相关参考---转
  12. css3仿山猫侧边栏
  13. 山寨游戏的未来Apple App Store
  14. RDIFramework.NET V3.3 WinForm版角色授权管理新增角色对操作权限项、模块起止生效日期的设置
  15. SimpleDateFormat 线程不安全及解决方案
  16. react中对于context的理解
  17. 【vue】中 $parent 和 $children 的使用方法
  18. APICloud和海马玩模拟器结合调试手机页面
  19. 2017-12-24 自定义view相关学习
  20. 【Python】【持续项目】Python-安全项目搜集

热门文章

  1. Flutter学习笔记(一)
  2. C# Interface中的属性
  3. Java的JDK和JRE
  4. php安装时开启很多扩展,如果忘了开启某些扩展,以后还能加上吗?答案是可以的
  5. &lt;yii 框架学习&gt; yii 框架改为中文提示
  6. webService开发(JDK版)
  7. luogu P2408 不同子串个数
  8. Knapsack CodeForces - 1132E (多重背包)
  9. Jenkins install
  10. Golang中defer、return、返回值之间执行顺序的坑