diff --git a/top-interview-leetcode150/dynamic-planning/198打家劫舍.js b/top-interview-leetcode150/dynamic-planning/198打家劫舍.js new file mode 100644 index 0000000..5e97194 --- /dev/null +++ b/top-interview-leetcode150/dynamic-planning/198打家劫舍.js @@ -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; +} diff --git a/top-interview-leetcode150/dynamic-planning/300最长递增子序列.js b/top-interview-leetcode150/dynamic-planning/300最长递增子序列.js new file mode 100644 index 0000000..eb88c9b --- /dev/null +++ b/top-interview-leetcode150/dynamic-planning/300最长递增子序列.js @@ -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]); diff --git a/top-interview-leetcode150/dynamic-planning/70爬楼梯.js b/top-interview-leetcode150/dynamic-planning/70爬楼梯.js new file mode 100644 index 0000000..ecb05e1 --- /dev/null +++ b/top-interview-leetcode150/dynamic-planning/70爬楼梯.js @@ -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; +}