如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想自己作为自律工具趁着过年没事每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的
2021放假第五天,2月10日
动态规划
题号:剑指offer42
var maxSubArray = function (nums) {
//dp表含义:以i元素结尾的的子数组的和的最大值
//和53题一样
let dptable = []
for (let i = 0; i < nums.length; i++) {
if (i == 0) {
dptable[i] = nums[i]
} else {
dptable[i] = Math.max(nums[i], nums[i] + dptable[i - 1])
}
}
return Math.max(...dptable)
};
题号:392
//此题的第一直觉就是双指针,遍历s,t串
//根据双指针遍历推演的结果,其实很容易发现
//每一次遍历的结果都是下面dptable中的结果
var isSubsequence = function (s, t) {
//规避特殊情况
if (s.length == 0) {
return true
}
if (t.length == 0) {
return false
}
//下面开辟数组+1的目的是为了方便处理,有些状态方程的一些边界情况的处理
//通过dptable多开辟一些空间可以规避一些逻辑判断
//dptable的含义:字符串s,0...i,是否是字符串t,0...j的字串
//可状态压缩
let dptable = new Array(s.length + 1)
for (let i = 0; i < dptable.length; i++) {
let arr = new Array(t.length + 1).fill(0)
dptable[i] = arr
}
for (let i = 0; i < s.length + 1; i++) {
for (let j = 0; j < t.length + 1; j++) {
if (i == 0) {
dptable[i][j] = 1
} else {
if (j == 0) {
dptable[i][j] = 0
} else {
//什么都不管先写出我想的状态方程(可能对,可能不对,发现很难走通了就赶紧切换思路)
//不能顺着第一思路撞南墙
if (s[i - 1] == t[j - 1]) {
dptable[i][j] = dptable[i - 1][j - 1]
} else {
dptable[i][j] = dptable[i][j - 1]
}
}
}
}
}
return dptable[s.length][t.length]
};
题号:746
//从顶向下思考,从下向上递推状态
var minCostClimbingStairs = function (cost) {
//dptable含义:到下标为i的台阶需要的最小花费,第i阶台阶的花费可不能算
let dptable = []
for (let i = 0; i <= cost.length; i++) {
if (i == 0) {
//选择第0台阶开始
dptable[i] = 0
} else if (i == 1) {
//选择第1台阶开始
dptable[i] = 0
} else {
dptable[i] = Math.min(dptable[i - 1] + cost[i - 1], dptable[i - 2] + cost[i - 2])
}
}
return dptable[cost.length]
};
题号:62
var uniquePaths = function (m, n) {
let dptable = new Array(m)
for (let i = 0; i < dptable.length; i++) {
let arr = new Array(n)
dptable[i] = arr
}
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (i == 0) {
dptable[0][j] = 1
} else {
if (j == 0) {
dptable[i][0] = 1
} else {
dptable[i][j] = dptable[i - 1][j] + dptable[i][j - 1]
}
}
}
}
return dptable[m - 1][n - 1]
};