斐波那契数列
/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
const mod = 1000000007
if(n<2){
return n
}
let l = 0, r = 0, num = 1//num=0+1
for(let i = 2;i<=n;i++){
l = r
r = num
num = (r+l)%mod
}
return num
};
打家劫舍
题目描述
思路:就是要和不要,保存dp[i-2]和dp[i-1]的状态
dp[i] = max(dp[i-2]+nums[i],dp[i-1])
/**
* @param {number[]} nums
* @return {number}
*/
var rob = function(nums) {
if(nums==null||nums.length==0) return 0
if(nums.length == 1) return nums[0]
if(nums.length == 2) return Math.max(nums[0],nums[1])
// let dp = []
// dp[0] = nums[0]
// dp[1] = Math.max(nums[0],nums[1])
let left = nums[0]
let right = Math.max(nums[0],nums[1])
let result = right
for(let i = 2;i<nums.length;i++){
result = Math.max(nums[i]+left,right)
left =right
right = result
}
return result
};
打家劫舍2
题目描述
思路
分两种情况,一种为选第一个遍历到倒数第二个,另一种是选第2个遍历到倒数第一个
/**
* @param {number[]} nums
* @return {number}
*/
var rob = function(nums) {
if(nums==null||nums.length==0) return 0
if(nums.length == 1) return nums[0]
if(nums.length == 2) return Math.max(nums[0],nums[1])
return Math.max(rob2(nums,0,nums.length-2),rob2(nums,1,nums.length-1))
};
let rob2 = function(nums,start,end){
let left = nums[start]
let right = Math.max(nums[start],nums[start+1])
let result = right
for(let i = start+2;i<=end;i++){
result = Math.max(nums[i]+left,right)
left = right
right = result
}
return result
}
爬楼梯
题目描述
思路
和斐波那契数列一样的思路
dp[i]=dp[i-1]+dp[i-2]
/**
* @param {number}
* @return {number}
*/
var climbStairs = function(n) {
if(n==0) return 0
if(n==1) return 1
if(n==2) return 2
let left = 1
let right = 2
let result = 0
for(let i = 3;i<=n;i++){
result = left+right
left = right
right = result
}
return result
};