1.买卖股票的最佳时机
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
解法:遍历数组每一个元素,设置一个变量为minPrice为整数类型最大数,让每个元素跟他比较,
假如元素把比他小,赋值给该变量,否则让该元素减去minPrice当前最小元素,如果比已知的最大利润大,那就赋值给最大利润
class Solution {
public int maxProfit(int[] prices) {
int max=0;
int minPrice=Integer.MAX_VALUE;
for(int i=0;i<prices.length;i++){
if(prices[i]<minPrice){
minPrice=prices[i];
}else if(prices[i]-minPrice>max){
max=prices[i]-minPrice;
}
}
return max;
}
}
2.买卖股票的最佳时机Ⅱ
给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
解法:
由于股票的购买没有限制,因此整个问题等价于寻找 x 个不相交的区间 (li,ri] 使得如下的等式最大化,res = (prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0]) = prices[3] - prices[0] 。
class Solution {
public int maxProfit(int[] prices) {
int profit=0;
for(int i=1;i<prices.length;i++){
if(prices[i]-prices[i-1]>0){
profit=profit+prices[i]-prices[i-1];
}
}
return profit;
}
}
3.跳跃游戏
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
解法:
每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
class Solution {
public boolean canJump(int[] nums) {
int n=nums.length;
int most=0;
for(int i=0;i<n;++i){
if(i<=most){
most=Math.max(most,i+nums[i]);
if(most>=n-1){
return true;
}
}
}
return false;
}
}