53. 最大子数组和
这是贪心算法的一道较为经典的题。首先,如果数组只有1个数,那么返回该数就可以了。如果数组的长度大于等于2,那我们就要好好讨论了。
这时候,我们先声明几个数,count和largest赋为无限小,而sum赋为0. 从下标为0的数开始遍历,如果sum<0,则continue。如果大于等于0,则继续判断其与count的大小,取其大者赋值给count.而largest则是一直用来判断当前最大的数,用于处理全是负值的数组。
若全是负值,则只用返回largest,除此之外,返回count就可以。
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
if(nums.length === 1) return nums[0];
let count = -Infinity;
let largetst = -Infinity;
let sum = 0;
for(let i = 0;i < nums.length;i++){
largetst = largetst >= nums[i] ? largetst : nums[i];
sum += nums[i];
if(sum < 0){
sum = 0;
continue;
}
count = sum >= count ? sum : count;
}
if(count === -Infinity) return largetst;
return count;
};
122. 买卖股票的最佳时机 II
其实这题看上去找不到什么好的解决办法,但是仔细想一想,我们只用将每日交易差做成一个数组,然后将正交易差累加,就是我们的答案了。
(贪心算法很多时候流程不难,但想到方法确实要花一点时间~)
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
let profit = 0;
for(let i = 0;i < prices.length - 1;i++){
let minus = prices[i + 1] - prices[i];
if(minus < 0) continue;
profit += minus;
}
return profit;
};
55. 跳跃游戏
对于这题,我们需要运用好声明的cover,通过i + nums[i]与最大覆盖范围进行比较,取其大值赋值给cover。若cover >= nums.length - 1,则return true,否则为false.
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
let cover = 0;
if(nums.length === 1) return true;
for(let i = 0;i <= cover;i++){
cover = i + nums[i] > cover ? i + nums[i] : cover;
if(cover >= nums.length - 1) return true;
}
return false;
};
45. 跳跃游戏 II
先声明三个变量cover, step, curCover. 取i + nums[i]与cover的大值给cover。然后进行判定,若i与cover值相同(当前为最大覆盖值),则将step值+1,并将已有的cover赋值给curCover.同时对现在的cover判定,如果已经大于等与最后的下标值,则break并返回,否则继续循环。
/**
* @param {number[]} nums
* @return {number}
*/
var jump = function(nums) {
if(nums.length === 1) return 0;
let cover = 0;
let step = 0;
let curCover = 0;
for(let i = 0;i < nums.length;i++){
cover = i + nums[i] > cover ? i + nums[i] : cover;
if(i === curCover){
if(curCover !== nums.length - 1){
step++;
curCover = cover;
if(cover >= nums.length - 1) break;
}
}
}
return step;
};