Q1:nunms[i]代表股票的第i天的股价,求可获得的最大收益.交易一次.
public class besttimetobuyandsellstock {
public int maxProfit(int[] prices) {
if (prices.length==0||prices==null){
return 0;
}
int result=0;
int min=prices[0];
for (int i=1;i<prices.length;i++){
if (prices[i]>min){
result=Math.max(result,prices[i]-min);//计算结果值
}else {
min= prices[i];//保存买入的那一天
}
}
return result;
}
public int maxProfitII(int[] prices){
if (prices.length==0||prices==null){
return 0;
}
int local = 0;
int global = 0;
for (int i=1;i<prices.length;i++){
local=Math.max(0,local+prices[i]-prices[i-1]);//局部最大值,注意表达式
global= Math.max(global,local);//全局最大值
}
return global;
}
}
Q2:假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。
设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。
然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。
public class BestTimetoBuyandSellStockII {
public int maxProfit(int[] prices) {
if (prices.length==0||prices==null){
return 0;
}
int res = 0;
for (int i=1;i<prices.length;i++){
if (prices[i]-prices[i-1]>0){
res +=prices[i]-prices[i-1];//把所有的增长的都加起来,就是k次的最大利润
}
}
return res;
}
}
假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。
设计一个算法来找到最大的利润。你最多可以完成两笔交易。
思想:二分 每一个i作为一个分界点 存储最大的利润
public class BestTimetoBuyandSellStockIII {
public int maxProfit(int[] prices) {
// write your code here
if (prices.length==0||prices==null){
return 0;
}
int length = prices.length;
int[] first = new int[length];
int[] second = new int[length];
int min = prices[0];
for (int i=1;i<prices.length;i++){
min = Math.min(min,prices[i]);
first[i]=Math.max(first[i-1],prices[i]-min);//从前往后计算出当前i的最大利润0-i的利润
}
int max = prices[length-1];
for (int i = length-2;i>=0;i--){
max = Math.max(max,prices[i]);
second[i]=Math.max(second[i+1],max-prices[i]);//从后往前计算当前i的最大利润i-nums.length的利润
}
int maxprofit = 0;
for (int i=0;i<length;i++){
maxprofit=Math.max(maxprofit,first[i]+second[i]);
}
return maxprofit;
}
}