1. 程式人生 > >Leetcode - 買賣股票的最佳時機

Leetcode - 買賣股票的最佳時機

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

題目描述

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

如果你最多隻允許完成一筆交易(即買入和賣出一支股票),設計一個演算法來計算你所能獲取的最大利潤。

注意你不能在買入股票前賣出股票。

示例 1:

輸入: [7,1,5,3,6,4]
輸出: 5
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
     注意利潤不能是 7-1 = 6, 因為賣出價格需要大於買入價格。

示例 2:

輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

解題思路

該題解法和最大連續子陣列和的解法思路是一樣的。

1、根據股票的利益意義,想要更多利益則值低時買進,值高時賣出。根據提供的股票價格不方便得出股票價格變化,對原資料進行計算:list[i] - list[i-1] = 股票的變化。變化為正時股票增長(存在利益),變化為負時股票為下跌(無利益)。

2、得到股票的變化值列表,即求最大子陣列和,最後得到正解。

#define max(a, b) a > b ? a : b
int maxProfit(int* prices, int pricesSize) {
    int max=0,s, i, j, dp[1000010], nums[1000010];
    for (i = 0; i < pricesSize - 1; i++)
        nums[i] = prices[i + 1] - prices[i];
    max = dp[0] = nums[0];
    if (max < 0)
        max = 0;
    for (int i = 1; i < pricesSize - 1; i++) {
        if (dp[i - 1] < 0)
            dp[i - 1] = 0;
        dp[i] = dp[i - 1] + nums[i];
        max = max(max, dp[i]);
    }
    return max;
}