55、跳跃游戏
题目:[2,3,1,1,4]
你站在数组的第一个元素的位置上,第一次你的跳跃范围是nums[0] 。eg:nums[0]=2 说明你可以跳在数组的索引范围为(0,2+0]的任意一个位置,如果你选择跳在索引1的位置上,那么第二次你的跳跃范围是nums[1]=3,说明接下来你可以跳跃的数组的索引范围为(1,3+1]的任意一个位置。根据你选择跳跃来判断是否能够到达最后一个下标(终点)。
那我们肯定是要选能跳跃的索引范围内中元素最大的来。
第一次的跳跃范围是(0,2+0] 那么我们选择范围内最大的数值3。那么直接跳到终点
class Solution {
public boolean canJump(int[] nums) {
// 题目:[2,3,1,1,4]
// 你站在数组的第一个元素的位置上,第一次你的跳跃范围是nums[0]
// eg:nums[0]=2 说明你可以跳在数组的索引范围为(0,2+0]的任意一个位置
// 如果你选择跳在索引1的位置上,那么第二次你的跳跃范围是nums[1]=3
// 说明接下来你可以条仔数组的索引范围为(1,3+1]的任意一个位置
// 根据你选择跳跃来判断是否能够到达最后一个下标。
//那我们肯定是要选能跳跃的索引范围内中元素最大的来。
if(nums.length==1) return true;
int cover=0;
for(int i=0;i<=cover;i++){
cover=Math.max(nums[i]+i,cover);
if(cover>=nums.length-1){
return true;
}
}
return false;
}
}
122、买卖股票的最佳时机 II
从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。
那么只收集正利润就是贪心所贪的地方!
局部最优:收集每天的正利润,全局最优:求得最大利润。
局部最优可以推出全局最优,找不出反例,试一试贪心(如果局部最优可以推出全局最优,那就试试贪心算法,如果局部最优推不出全局最优,那就不是贪心算法)
需要说明的是,在此题中:贪心算法只能用于计算最大利润,计算的过程并不是实际的交易过程。如[1,2,3,4,5],实际的交易过程并不是进行 4 次买入和 4 次卖出,而是在第 1 天买入,第 5 天卖出。
class Solution {
public int maxProfit(int[] prices) {
int profit=0;
int sum=0;
for(int i=1;i<prices.length;i++){
profit=prices[i]-prices[i-1];
if(profit>0){
sum+=profit;
}
}
return sum;
}
}
860、柠檬水找零
class Solution {
public boolean lemonadeChange(int[] bills) {
if(bills[0]==10||bills[0]==20) return false;
int five=1,ten=0,twenty=0;//每个金额的张数
for(int i=1;i<bills.length;i++){
if(bills[i]==5){
five++;
}else if(bills[i]==10){
if(five>0){
five--;
ten++;
}else{
return false;
}
}else if(bills[i]==20){
if(five>0&&ten>0){
five--;
ten--;
twenty++;
}else if(five>=3){//20-5=15 所以five最少要3张
five-=3;
twenty++;
}else{
return false;
}
}
}
return true;
}
}