4.25(复习算法--动态规划)
今天复习算法,因为在看小说,入迷了,怠慢了项目,只好看看算法喽~~~
动态规划问题,暂时还写的简单的,难的还没来得及去观摩,只能说是观摩,毕竟学习算法就是看别人怎么写代码,然后恍然大悟:“哦~原来是这样!”
杨辉三角
主要根据上一层数据得到下一层数据,问题关键主要在于如何获取上一层数据的所有索引,虽然遍历当前层数都很简单,但是一说起使用之前循环的变量,一搞动态就有人一脸懵,一般来说在js中如果你变量数组,首先想到是map或者是forEach那么你会很作难,实际上使用for in,for循环页消耗不了多少时间复杂度。
var generate = function(numRows) {
//声明结果变量
const ret =[]
//双层循环嵌套容易获取上一层数据
for(let i=0;i<numRows;i++){
//声明新的一行的内存变量
const row =new Array(i+1).fill(1)
for(let j=1;j<row.length-1;j++){
//根据上一行填充下一行变量
row[j]=ret[i-1][j-1]+ret[i-1][j]
}
//直接将一行加入多维数组
ret.push(row)
}
return ret
};
爬楼梯
爬楼梯实际上是根据之前计算的数据来得到后面的方法数,多少观察规律,或者直接找根本,第i个数等于之前两个数之和,arr[i]=arr[i-1]+arr[i-2]
1 1 2 3 5.。。。
var climbStairs = function(n) {
let p=0,q=0,r=1
for(let i=1;i<=n;++i){
p=q
q=r
r=p+q
}
return r
};
其实做一些算法就会发现一些规律,还不完全,先写下来
顺序:
- 声明结果变量,存储结果,
- 声明所需变量,将你想到的数据都写出来,后面不需要再删除
- 需不需要辅助变量?这个比较难,,难想,多做就好
- 实现方式,需要用到索引就使用for,直接使用值就使用封装好的方法,map,forEach等,
- javaScript实现数据结构可能需要辅助函数,lodash
- 必须熟悉各种变量的声明方式,包括指针,set,map,等方法