买卖股票的最佳时机(Java)

121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

1 < = p r i c e s . l e n g t h < = 1 0 5 1 <= prices.length <= 10^5 1<=prices.length<=105
0 < = p r i c e s [ i ] < = 1 0 4 0 <= prices[i] <= 10^4 0<=prices[i]<=104

思路:

  • 因为要使盈利最大,所以买入的价格越低越好,但是卖出只能是在买入后卖出,而卖出的价格则是要越高越好。
  • 所以我们要找最低点min
  • 而最高点max只能在最低点min后面找
  • 另外用p存储当前的最大利润,max-min; 当max变大时,判断是否比之前的大,进行相应的更新。

代码(Java):

public class max_stock {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int [] price = {7,6,4,3,1}; 
		System.out.println(maxProfit(price));

	}
	public static int maxProfit(int[] prices) {
		
		int p = 0;
		int min = prices[0];
		int max = prices[0];
		for(int i=1; i<prices.length; i++) {
			if(prices[i] < min) {
				min = prices[i];
				max = prices[i];
			}else if(prices[i] > max){
				max = prices[i];
				if(max - min > p)
					p = max - min;
			}
		}
		return p;
    }
}

复杂度分析:

  • 时间复杂度:O(n),只需要遍历一次。
  • 空间复杂度:O(1),只使用了常数个变量。

来源:力扣(LeetCode)

注:仅供学习参考,有什么不足之处感谢指正!

你可能感兴趣的:(java,LeetCode,leetcode,算法,职场和发展)