题目一 122. 买卖股票的最佳时机 II
思路
每次把两数相减之后得正数的相加,最后得到的值就是最大的值。
var maxProfit = function(prices) {
let max = 0;
for (let i = 1; i < prices.length; i++) {
if (prices[i] - prices[i - 1] > 0) {
max += prices[i] - prices[i - 1];
}
}
return max;
};
题目二 55. 跳跃游戏
思路
不断计算能覆盖的最大区间,如果区间大于长度,返回true,这里要注意的是更新的限制是要在可以覆盖的范围的下标内更新。
var canJump = function(nums) {
let maxScale = 0;
let len = nums.length;
for (let i = 0; i <= maxScale; i++) { // 是到maxScale
if (i + nums[i] > maxScale) {
maxScale = i + nums[i];
}
if (maxScale >= len - 1) {
return true;
}
}
return false;
};
var canJump = function(nums) {
let max = 0;
const len = nums.length;
for (let i = 0; i < len; i++) {
// 在可以作为起点的每一个点上不断更新最大值,如果超过长度,则返回true
if (i <= max) {
max = Math.max(max, i + nums[i]);
if (max >= len - 1) {
return true;
}
}
}
return false;
};
题目三 45. 跳跃游戏 II
方法1
从前向后遍历,记录当前覆盖的最大范围和下一个元素覆盖的最大范围,如果当前索引等于了最大覆盖范围,则步数+1
var jump = function(nums) {
let cur = 0;
let next = 0;
let count = 0;
for (let i = 0; i < nums.length - 1; i++) {
next = Math.max(nums[i] + i, next);
if (i === cur) {
cur = next;
count++;
}
}
return count;
};
方法2
从后向前遍历,然后遍历当前位置之前的元素,是否能覆盖当前的最大距离,能的话,更新end,count++,这个是双层循环。性能不一定好。
var jump = function(nums) {
let count = 0;
let end = nums.length - 1;
while (end > 0) {
for (let j = 0; j < end; j++) {
if (nums[j] + j >= end) {
count++;
end = j;
break;
}
}
}
return count;
};
总结
感觉这个贪心算法不简单啊,这个跳跃游戏就不太好想,想了也不好写出来,是自己的短板。难啊,怎么才能掌握好。