- 221.最大正方形
- 1143.最长公共子序列—1
- 300.最长递增子序列
- 70.爬楼梯
- 63.不同路径2
- 64.最小路径和
- 542.01 矩阵
- 322.零钱兑换
- 5.最长回文子串
- 198.打家劫舍
- 300.最长递增子序列
- 494.目标和
- 股票系列
221.最大正方形
var maximalSquare = function (matrix) {
const m = matrix.length;
const n = matrix[0].length;
const dp = Array(m)
.fill(0)
.map(() => Array(n).fill(0));
let maxLen = 0;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (matrix[i][j] === "1") {
if (i === 0 || j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1;
}
maxLen = Math.max(maxLen, dp[i][j]);
}
}
}
return maxLen * maxLen;
};
maximalSquare([
["1", "0", "1", "0", "0"],
["1", "0", "1", "1", "1"],
["1", "1", "1", "1", "1"],
["1", "0", "0", "1", "0"],
]);
1143.最长公共子序列—1
var longestCommonSubsequence = function (text1, text2) {
const m = text1.length;
const n = text2.length;
const dp = Array(m + 1)
.fill(0)
.map(() => Array(n + 1).fill(0));
for (let i = 1; i <= m; i++) {
const s1 = text1[i - 1];
for (let j = 1; j <= n; j++) {
const s2 = text2[j - 1];
if (s1 === s2) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
};
longestCommonSubsequence("abcde", "ace");
300.最长递增子序列
var lengthOfLIS = function (nums) {
const len = nums.length;
let ans = 1;
const dp = Array(len).fill(1);
for (let i = 1; i < len; i++) {
for (let j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
console.log(dp);
ans = Math.max(ans, dp[i]);
}
return ans;
};
lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18]);
70.爬楼梯
var climbStairs = function (n) {
const dp = [];
dp[0] = 1;
dp[1] = 1;
for (let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
console.log(dp[n]);
return dp[n];
};
climbStairs(2);
climbStairs(10);
63.不同路径2
var uniquePathsWithObstacles = function (obstacleGrid) {
const m = obstacleGrid.length;
const n = obstacleGrid[0].length;
dp = Array(m)
.fill()
.map((item) => Array(n).fill(0));
for (let i = 0; i < m && obstacleGrid[i][0] === 0; i++) {
dp[i][0] = 1;
}
for (let j = 0; j < n && obstacleGrid[0][j] === 0; j++) {
dp[0][j] = 1;
}
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
dp[i][j] = obstacleGrid[i][j] === 1 ? 0 : dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
};
64.最小路径和
var minPathSum = function (grid) {
const m = grid.length;
const n = grid[0].length;
dp = Array(m)
.fill()
.map((item) => Array(n).fill(0));
dp[0][0] = grid[0][0];
for (let i = 1; i < m; i++) {
dp[i][0] = grid[i][0] + dp[i - 1][0];
}
for (let j = 1; j < n; j++) {
dp[0][j] = grid[0][j] + dp[0][j - 1];
}
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[m - 1][n - 1];
};
542.01 矩阵
var updateMatrix = function (mat) {
const m = mat.length;
const n = mat[0].length;
const dp = Array(m)
.fill(0)
.map(() => Array(n).fill(Infinity));
for (let i = 0; i < m; i++) {
if (mat[i][0] === 0) dp[i][0] = 0;
if (mat[i][n - 1] === 0) dp[i][n - 1] = 0;
}
for (let j = 0; j < n; j++) {
if (mat[0][j] === 0) dp[0][j] = 0;
if (mat[m - 1][j] === 0) dp[m - 1][j] = 0;
}
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (mat[i][j] === 0) {
dp[i][j] = 0;
} else {
if (i - 1 >= 0) dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + 1);
if (j - 1 >= 0) dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + 1);
}
}
}
for (let i = m - 1; i >= 0; i--) {
for (let j = n - 1; j >= 0; j--) {
if (i + 1 < m) dp[i][j] = Math.min(dp[i][j], dp[i + 1][j] + 1);
if (j + 1 < n) dp[i][j] = Math.min(dp[i][j], dp[i][j + 1] + 1);
}
}
console.table(dp);
return dp;
};
updateMatrix([
[0, 0, 0],
[0, 1, 0],
[1, 1, 1],
]);
updateMatrix([
[0, 1, 0, 1, 1],
[1, 1, 0, 0, 1],
[0, 0, 0, 1, 0],
[1, 0, 1, 1, 1],
[1, 0, 0, 0, 1],
]);
322.零钱兑换
var coinChange = function (coins, amount) {
let n = coins.length;
const dp = Array(n + 1)
.fill(0)
.map(() => Array(amount + 1).fill(amount + 1));
dp[0][0] = 0;
for (let i = 1; i < n + 1; i++) {
for (let j = 0; j < amount + 1; j++) {
if (j < coins[i - 1]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - coins[i - 1]] + 1);
}
}
}
console.log(dp[n][amount] == amount + 1 ? -1 : dp[n][amount]);
return dp[n][amount] == amount + 1 ? -1 : dp[n][amount];
};
coinChange([2], 3);
5.最长回文子串
var longestPalindrome = function (s) {
let len = s.length;
let res = "";
let dp = Array(len)
.fill(0)
.map(() => Array(len).fill(false));
for (let i = len - 1; i >= 0; i--) {
for (let j = i; j < len; j++) {
dp[i][j] = s[i] === s[j] && (j - i < 2 || dp[i + 1][j - 1]);
if (dp[i][j] && j - i + 1 > res.length) {
res = s.substring(i, j + 1);
}
}
}
console.log(res);
return res;
};
longestPalindrome("babad");
198.打家劫舍
var rob = function (nums) {
const dp = [nums[0], Math.max(nums[0], nums[1])];
for (let i = 2; i < nums.length; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[nums.length - 1];
};
console.log(rob([1, 2, 3, 1]));
300.最长递增子序列
var lengthOfLIS = function (nums) {
const len = nums.length;
let ans = 1;
const dp = Array(len).fill(1);
for (let i = 1; i < len; i++) {
for (let j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
console.log(dp);
ans = Math.max(ans, dp[i]);
}
return ans;
};
lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18]);
494.目标和
var findTargetSumWays = function (nums, target) {
const sum = nums.reduce((x, y) => x + y);
if (Math.abs(target) > sum) return 0;
if ((target + sum) % 2) return 0;
const left = (target + sum) / 2;
const dp = Array(left + 1).fill(0);
dp[0] = 1;
for (let i = 0; i < nums.length; i++) {
console.log(i);
for (let j = left; j >= nums[i]; j--) {
dp[j] += dp[j - nums[i]];
console.log(dp);
}
}
return dp[left];
};
findTargetSumWays([1, 1, 1, 1, 1], 3);
股票系列
var maxProfit = function (k, prices) {
const len = prices.length;
const dp = Array(len)
.fill(0)
.map(() => Array(k + 1).fill([0, 0]));
for (let j = 1; j < k + 1; j++) {
dp[0][j][1] = -prices[0];
}
console.log(dp);
for (let i = 1; i < len; i++) {
for (let j = 1; j < k + 1; j++) {
dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i]);
dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j][0] - prices[i]);
}
console.table(dp);
}
return dp[len - 1][k][0];
};
console.log(maxProfit(2, [2, 4, 1]));