1. 程式人生 > >leetcode 121 Best Time to Buy and Sell Stock(最大盈利)

leetcode 121 Best Time to Buy and Sell Stock(最大盈利)

題目要求(高頻題)

假設你有一個數組,其中第i個元素是第i天的股票價格。
如果您只被允許完成最多一筆交易(即買入並賣出一股股票),請設計演算法以找到最大利潤
請注意,在購買之前不能出售股票。

解題思路

在陣列中尋找最大利潤,和leetcode 53 求最大子陣列是一種型別的題目,所以我們可以採取同樣的策略,使用Kadane’s演算法。

本題中,涉及到兩個變數,一個是買入價格(作為區域性最優),一個是整體利潤(看作全域性最優),與53題不太一樣的是,買入價格是取最小值(之前買入最小,當前遍歷價格中的最小值),利潤是取最大值(之前最大利潤,當前最大利潤減去當前買入最小)

主要程式碼 c++

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size()==0) return 0; // 
        int buy = prices[0], profit = prices[0] - buy;
        for(int i=1; i<prices.size();i++)
        {
        	// Kadane's algorithm core step
            buy = min(prices[
i], buy); profit = max(profit, prices[i]-buy); } return profit; } };

注意!!!

Kadane’s 演算法在陣列中求最大子陣列的和這一類問題中有著高效的表現,但是需要注意的是,並不是所有的程式碼寫法都一樣,需要根據具體問題進行具體分析,如本題是求利潤最大,那麼買入的價格就需要儘可能的小,所以對買入價格的獲取採用min(a,b)進行操作。

掌握演算法的核心思想才是最重要的,Kadane’s演算法最重要的是找到兩個變數(區域性,全域性)的獲取方式,多刷刷題目,繼續積累吧!

原題連結:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/