动态规划
动规五部曲分析如下:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
题一:给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
思路:
- 声明一个数组db
- 两个for循环 存储第一个for下标下的长度
/**
* @param {number[]} nums
* @return {number}
*/
var lengthOfLIS = function(nums) {
let len = nums.length,db = new Array(len).fill(1);
let result = 1;
for(let j=1;j<len;j++){
for(let i=0;i<j;i++){
if(nums[j]>nums[i]){
db[j] = Math.max(db[j],db[i]+1)
}
}
result = Math.max(result, db[j]);
}
return result
};
复制代码
题二:给定两个字符串 text1
和 text2
,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0
。
思路
- 声明一个数组
- 两个for循环可以看成text1、text2的二维数组
/**
* @param {string} text1
* @param {string} text2
* @return {number}
*/
var longestCommonSubsequence = function(text1, text2) {
let arr = Array.from(new Array(text1.length+1),()=>new Array(text2.length+1).fill(0));
for(let i=1;i<=text1.length;i++){
for(let j=1;j<=text2.length;j++){
if(text1[i-1] === text2[j-1]){
arr[i][j] = arr[i-1][j-1]+1
}else{
arr[i][j] = Math.max(arr[i-1][j],arr[i][j-1])
}
}
}
return arr[text1.length][text2.length]
};
复制代码
tips: Array.from(arrayLike[, mapFn[, thisArg]])
-
arrayLike
-
想要转换成数组的伪数组对象或可迭代对象。
-
mapFn
可选 -
如果指定了该参数,新数组中的每个元素会执行该回调函数。
-
thisArg
可选 -
可选参数,执行回调函数
mapFn
时this
对象。