给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
贪心的策略?
首先明白每一天的利润等于p[i+1]-p[i]
例如第三天利润为:p[2]-p[1]+p[1]-p[0],也就是p[2]-p[0]。
对于每天的利润来:p[今天]-p[昨天]他无非只有三种情况,也就是正数,负数,0,而本题贪心的策略就是只取正数,也就是亏钱的统统不要,累加之后就可以得到最大利润。
class Solution {
public int maxProfit(int[] prices) {
//使用贪心算法
//局部最优是哪个
//每一天的利润等于:p[i+1]-p[i]
//例如第三天的利润:p[2]-p[1]+p[1]-p[0]
//相减求出的利润值为正数就进行相加,最终求出的额就是最大利润
int day=1;
int money=0;
if(prices.length==1) return 0;
while(day<prices.length){
int dayprofit=prices[day]-prices[day-1];
if(dayprofit>0) money+=dayprofit;
day++;
}
return money;
}
}
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
贪心策略:
对于这个题目,求解的是可不可以跳到,于是我们不去考虑具体的每一跳落点在哪里,只考虑每一条的最大跳跃长度,也就是覆盖范围是多少,在循环之中不断更新最大的覆盖范围,当覆盖范围可以覆盖整数组的时候说明可以达到。
class Solution {
public boolean canJump(int[] nums) {
//不纠结如何去跳,我们只关注,每一次跳跃的最大长度的覆盖范围,
//如果可以覆盖所有的范围,即为成功
if(nums.length==1) return true;
int rap=0;
int cover=0;
int len=nums.length;
//当跳跃值小于等于覆盖范围的时候,循环进行
while(rap<=cover){
//比较原先的覆盖范围和最新的覆盖范围,我们取最大值
cover=Math.max(cover,rap+nums[rap]);
if(cover>=len-1) return true;
rap++;
}
return false;
}
}
给定一个长度为 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]
。
贪心策略:
对于这道题一定是可达的,求解最小的跳跃步骤,于是我们需要对每一步的落点进行分析,贪心的策略是,尽可能每一次跳跃所选择的都是最大的覆盖值,进而跳跃完成之后所得到的就是最小的跳跃步骤,因为每一步跳的最远,所以最后一定跳的最远。
class Solution {
public int jump(int[] nums) {
//沿用每一步覆盖范围的思路,每一步尽可能的跳到最远
int cur=0;
int maxCover=0;
int result=0;
int len=nums.length;
for(int i=0;i<len-1;i++){
//取当前位置的最大跳跃范围
maxCover=Math.max(maxCover,i+nums[i]);
if(i==cur){
//贪心的策略是每一次跳跃记录有效步数的都是最大的覆盖范围
cur=maxCover;
result++;
if(cur>=len-1) break;
}
}
return result;
}
}
周六休息周日刷!!!
By- 三条直线围墙