1. 程式人生 > >Leetcode121.+Leetcode53. Kadane演算法解決最大子陣列問題

Leetcode121.+Leetcode53. Kadane演算法解決最大子陣列問題

Leetcode121. Best Time to Buy and Sell Stock

題目

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: 5
max_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: 0
In this case, no transaction is done, i.e. max profit = 0.

解題分析

這道題粗略一看不是很難,很普通的做法就是兩層迴圈,時間複雜度為O(n^2),那有沒有什麼更好的做法呢?
今天在這裡我推薦一種經典的解決最大子陣列的Kadene演算法。Kadane演算法掃描一次整個數列的所有數值,在每一個掃描點計算以該點數值為結束點的子數列的最大和(正數和)。該子數列由兩部分組成:以前一個位置為結束點的最大子數列、該位置的數值。
所以按照Kadene演算法的思想,用變數maxCur來記錄包含當前元素的最大值,用變數maxSoFar來記錄到目前為止所找到的最大值。每遍歷一個元素,就將該元素與上一個元素的差值加到maxCur上,如果maxCur大於maxSoFar,就更新maxSoFar的值,這樣在遍歷完一次陣列後,所獲得的maxSoFar就是最終的結果,時間複雜度為O(n)。是不是很簡單呢?

原始碼

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int maxCur = 0, maxSoFar = 0;
        for (int i = 1; i < prices.size(); i++) {
            maxCur = max(0, maxCur += prices[i] - prices[i - 1]);
            maxSoFar = max(maxCur, maxSoFar);
        }
        return
maxSoFar; } };

Leetcode53. Maximum Subarray

題目

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

解題分析

這道題與上面那道題非常類似,都是求最大子陣列的問題。類似地,我們用maxCur和maxSoFar兩個變數來分別記錄包含當前節點的和的最大值以及到目前為止所找到的和的最大值。在遍歷陣列求和的時候,如果之前遍歷的元素的和小於當前元素,就將maxCur更新為當前元素的值;如果maxCur大於maxSoFar,就更新maxSoFar的值,以確保maxSoFar記錄的是當前找到的陣列的最大和。同樣,在遍歷完一次陣列後,結果就自然出來了,下面簡要附上原始碼~

原始碼

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxCur = nums[0], maxSoFar = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            maxCur = max(nums[i], maxCur += nums[i]);
            maxSoFar = max(maxCur, maxSoFar);
        }
        return maxSoFar;
    }
};

以上是我對這兩道最大子陣列問題的一些想法,有問題還請在評論區討論留言~