leetcode 121. Best Time to Buy and Sell Stock

来源:互联网 发布:淘宝双11活动入口 编辑:程序博客网 时间:2024/06/05 12:48

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

Example 1:

Input: [7, 1, 5, 3, 6, 4]Output: 5max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)

Example 2:

Input: [7, 6, 4, 3, 1]Output: 0In this case, no transaction is done, i.e. max profit = 0.
简单题啦。

package leetcode;public class Best_Time_to_Buy_and_Sell_Stock_121 {public int maxProfit(int[] prices) {if(prices.length==0){return 0;}int lowest=prices[0];int highest=prices[0];int maxProfit=0;for(int i=1;i<prices.length;i++){if(prices[i]>highest){highest=prices[i];if(highest-lowest>maxProfit){maxProfit=highest-lowest;}}else if(prices[i]<lowest){lowest=prices[i];highest=lowest;}}return maxProfit;}public static void main(String[] args) {// TODO Auto-generated method stubBest_Time_to_Buy_and_Sell_Stock_121 b=new Best_Time_to_Buy_and_Sell_Stock_121();int[] prices=new int[]{3,2,6,5,0,3};System.out.println(b.maxProfit(prices));}}
这一题居然有Solution。 https://leetcode.com/problems/best-time-to-buy-and-sell-stock/solution/

Approach #2 (One Pass) [Accepted]

Algorithm

假设给定数组是:

[7, 1, 5, 3, 6, 4]

以下是图表表示:

Profit Graph

我们需要找到 跟在最低点后的最高点。可以使用两个变量:minprice 和 maxprofit ,分别代表最低点和最大利益。

Java

public class Solution {    public int maxProfit(int prices[]) {        int minprice = Integer.MAX_VALUE;        int maxprofit = 0;        for (int i = 0; i < prices.length; i++) {            if (prices[i] < minprice)                minprice = prices[i];            else if (prices[i] - minprice > maxprofit)                maxprofit = prices[i] - minprice;        }        return maxprofit;    }}

Complexity Analysis

  • Time complexity : O(n)O(n). Only a single pass is needed.

  • Space complexity : O(1)O(1). Only two variables are used.