feat: 一维动态规划70,198,300
This commit is contained in:
parent
1ababd7776
commit
07e407e943
38
top-interview-leetcode150/dynamic-planning/198打家劫舍.js
Normal file
38
top-interview-leetcode150/dynamic-planning/198打家劫舍.js
Normal file
@ -0,0 +1,38 @@
|
||||
/**
|
||||
* @param {number[]} nums
|
||||
* @return {number}
|
||||
*/
|
||||
const rob = function (nums) {
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
设dp[i]为偷取第i家时获取的最大利润,那么dp[i]可以由两种情况得来
|
||||
1.偷第i家,如果偷第i家,那么最大利润为 dp[i] = dp[i-2] + 第i家拥有的金额
|
||||
2.不偷第i家,如果不偷第i家,那么最大利润为 dp[i-1]的最大利润
|
||||
那么只需比较上面两种情况谁大,就是dp[i]的值,即dp[i] = Max(dp[i-1], dp[i-2] + nums[i])
|
||||
*/
|
||||
function f1(nums) {
|
||||
const n = nums.length;
|
||||
const dp = Array(n);
|
||||
dp[0] = nums[0];
|
||||
dp[1] = Math.max(nums[0], nums[1]);
|
||||
for (let i = 2; i < dp.length; i++) {
|
||||
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
|
||||
}
|
||||
return dp[n - 1];
|
||||
}
|
||||
|
||||
/*
|
||||
使用双指针优化
|
||||
*/
|
||||
function f2(nums) {
|
||||
let prev = 0;
|
||||
let curr = 0;
|
||||
for (const num of nums) {
|
||||
const temp = Math.max(curr, prev + num);
|
||||
prev = curr;
|
||||
curr = temp;
|
||||
}
|
||||
return curr;
|
||||
}
|
30
top-interview-leetcode150/dynamic-planning/300最长递增子序列.js
Normal file
30
top-interview-leetcode150/dynamic-planning/300最长递增子序列.js
Normal file
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* @param {number[]} nums
|
||||
* @return {number}
|
||||
*/
|
||||
const lengthOfLIS = function (nums) {
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
设dp[i]为以nums[i]结尾的递增子序列的最长长度,那么dp[i],nums[i]可以接在nums[0-i)中比它小的元素
|
||||
组成子序列,求那个结果最长的就是dp[i],即dp[i] = Max(nums[0-i)) +1
|
||||
*/
|
||||
function f1(nums) {
|
||||
const n = nums.length;
|
||||
const dp = Array(n).fill(1);
|
||||
dp[0] = 1;
|
||||
for (let i = 1; i < n; i++) {
|
||||
for (let j = 0; j < i; j++) {
|
||||
if (nums[j] < nums[i]) {
|
||||
// 更新dp[i]为最长子序列
|
||||
dp[i] = Math.max(dp[j] + 1, dp[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(dp);
|
||||
|
||||
return dp[n - 1];
|
||||
}
|
||||
|
||||
f1([1, 3, 6, 7, 9, 4, 10, 5, 6]);
|
41
top-interview-leetcode150/dynamic-planning/70爬楼梯.js
Normal file
41
top-interview-leetcode150/dynamic-planning/70爬楼梯.js
Normal file
@ -0,0 +1,41 @@
|
||||
/**
|
||||
* @param {number} n
|
||||
* @return {number}
|
||||
*/
|
||||
const climbStairs = function (n) {
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
这个题目就是求斐波那契数列的现实抽象,我们的最终目的是跳到第n个台阶,而每一次要么跳一步,要么跳两步,
|
||||
所以智能由n-1个台阶跳一步上来,或者由n-2个台阶跳两步上来,设dp[i]为跳转到这个台阶可能的方法,那么
|
||||
dp[i] = dp[i-1] + dp[i-2]
|
||||
*/
|
||||
function f1(n) {
|
||||
// 定义dp数组
|
||||
const dp = Array(n + 1);
|
||||
dp[1] = 1;
|
||||
dp[2] = 2;
|
||||
for (let i = 3; i <= n; i++) {
|
||||
dp[i] = dp[i - 1] + dp[i - 2];
|
||||
}
|
||||
return dp[n];
|
||||
}
|
||||
|
||||
/*
|
||||
通过观察上面的代码可以知道,dp[i]的结果只由它的前一个位置和前前个位置有关,所以定义两个变量first和second来
|
||||
保存这两个值
|
||||
*/
|
||||
function f2(n) {
|
||||
if (n < 3) return n;
|
||||
// 定义跳到前两个台阶可能的步数
|
||||
let first = 1;
|
||||
let second = 2;
|
||||
let result = 1;
|
||||
for (let i = 3; i <= n; i++) {
|
||||
result = first + second;
|
||||
first = second;
|
||||
second = result;
|
||||
}
|
||||
return result;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user