如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想自己作为自律工具趁着过年没事每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的
2021放假第四天,2月9日
动态规划
动态规划,折腾的我死去活来:拿到题目简单的还行,难的就嗝屁,难度一:你不知道这道题到底能不能动态规划,难点二:你不容易找出状态之间的联系,难点三:变量因子的选取决定我们状态方程的复杂度,有时候,考虑问题选取角度不同导致我状态方程的复杂度异常之高,所以告诫自己,如果在思考了选择某些变量因子建立方程之后感觉复杂度很高,不妨静下心去,换个角度,重新选变量因子
题号:面试题08.01
var waysToStep = function (n) {
//初始化一个队列dpTable,且其大小最大为3
//为3的目的是不需要一个完整的table记录状态
//只需要压缩状态为3个即可
let dpTable = []
for (let i = 1; i <= n; i++) {
//i = 1,2,3,为base情况
if (i == 1) {
dpTable.push(1)
} else if (i == 2) {
dpTable.push(dpTable[0] + 1)
} else if (i == 3) {
dpTable.push(dpTable[1] + dpTable[0] + 1)
} else {
//小心题意结果很大要取模别的没什么
let next = ((dpTable[0] + dpTable[1]) % 1000000007 + dpTable[2]) % 1000000007
dpTable.push(next)
dpTable.shift()
}
}
return dpTable.pop()
};
题号:面试题16.17
var maxSubArray = function (nums) {
//该dptable的含义是以i结尾的最大连续字串和
//dptable填满之后计算数组元素最大值即可
//可以压缩状态不用这个表记录子问题:保存前一个状态即可
let dpTable = []
let result = 0
for (let i = 0; i < nums.length; i++) {
if (i == 0) {
//base情况
dpTable[0] = nums[i]
result = dpTable[0]
} else {
dpTable[i] = Math.max(dpTable[i - 1] + nums[i], nums[i])
result = Math.max(dpTable[i], result)
}
}
return result
};
题号:面试题17.16
//可以压缩状态
//当我判定这道题能用动态规划解题的时候,脑海中就要不停的闪现几个词汇:
//状态->抉择->新状态->抉择->新状态......
//抉择就是我要考虑的状态方程
var massage = function (nums) {
if (nums.length == 0) {
return 0
}
//初始化一个二维数组,用来记录状态:
//状态是:到i的时候,i选择和i不选择这2个状态
//从中抉择生成新状态
let dpTable = new Array(nums.length)
for (let i = 0; i < nums.length; i++) {
let arr = new Array(2)
dpTable[i] = arr
}
for (let i = 0; i < nums.length; i++) {
if (i == 0) {
dpTable[i][0] = 0
dpTable[i][1] = nums[i]
} else {
dpTable[i][0] = Math.max(dpTable[i - 1][1], dpTable[i - 1][0])
dpTable[i][1] = dpTable[i - 1][0] + nums[i]
}
}
return Math.max(dpTable[nums.length - 1][1], dpTable[nums.length - 1][0])
};