一、题目
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
示例 1:
输入:prices = [7,1,5,3,6,4] 输出:7 解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。 ?? ? 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。 ? ? ?总利润为 4 + 3 = 7 。 示例 2:
输入:prices = [1,2,3,4,5] 输出:4 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。 ?? ? 总利润为 4 。 示例?3:
输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。
二、代码:
package com.company;
/**
* 买卖股票的最佳时机
*/
public class TradeStockBestTime {
public static void main(String[] args) {
int[] prices = {1,2};
System.out.println(maxProfit(prices));
int[] prices1 = {1,1};
System.out.println(maxProfit(prices1));
int[] prices2 = {2,1};
System.out.println(maxProfit(prices2));
int[] prices3 = {7,1,5,3,6,4};
System.out.println(maxProfit(prices3));
int[] prices4 = {1,2,3,4,5};
System.out.println(maxProfit(prices4));
int[] prices5 = {7,6,4,3,1};
System.out.println(maxProfit(prices5));
}
public static int maxProfit(int[] prices) {
if (null == prices || prices.length < 2) {
return 0;
}
//累计收益
int income = 0;
//买入的价格,-1表示未买入
int price = -1;
for (int first = 0; ;) {
if (prices[first] > prices[first +1]) {
//如果已买入,则要抛掉
if (price != -1) {
income = income + prices[first] - price;
price = -1;
}
} else {
if (price == -1) {
price = prices[first];
}
}
if (first + 1 == prices.length - 1) {
if (price != -1) {
income = income + prices[first +1] - price;
}
break;
}
first++;
}
return income;
}
}
|