feat: 一维动态规划70,198,300

This commit is contained in:
LouisFonda 2025-06-24 23:33:56 +08:00
parent 1ababd7776
commit 07e407e943
Signed by: yigencong
GPG Key ID: 29CE877CED00E966
3 changed files with 109 additions and 0 deletions

View 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;
}

View 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]);

View 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;
}