122. 买卖股票的最佳时机 II
要求: 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
思路
本题为有序无重复元素数组,适用于二分法思想,如果有重复元素,使用二分法返回的元素下表可能不是唯一的。
var maxProfit = function(prices) {
let res = 0
for(let i=0; i<prices.length; i++){
if(prices[i] <prices[i+1] ){
res += prices[i+1] - prices[i]
}
}
return res
};
55. 跳跃游戏
要求:给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
思路
判断数组的下标+跳跃长度 是否大于数组长度(>=nums.length-1),能够覆盖数组的话即表示能到达最后一个下标。
var canJump = function(nums) {
let cover = 0
if(nums.length == 1) return true
for(let i =0; i<=cover; i++){
cover = Math.max(cover, i+nums[i])
if(cover >= nums.length-1) return true
}
return false
};
45. 跳跃游戏 II
要求: 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
0 <= j <= nums[i]i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
思路
var jump = function(nums) {
let cur = 0 //当前覆盖的最远距离的下标
let next = 0 //下一步覆盖的最远距离的下标
let res = 0
if(nums.length ==1) return 0
for(let i=0; i<nums.length; i++){
next = Math.max(i+nums[i], next) //更新下一步覆盖的最远距离
if(i == cur){ //到达当前覆盖的最远距离的下标,下一步就是next
if(cur != nums.length-1){
res++
cur = next
if(cur >= nums.length-1) break
}else {
break
}
}
}
return res
};