leetcode-數組-簡單-最大子序和

 題目

給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

轉載鏈接 https://leetcode-cn.com/problems/maximum-subarray/

輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

解答

方法一: 

思路是這樣的,最直接的思路,從第一個數開始,挨個往後加結果比最大值大,就把最大值更新,一直算到最後一個。

然後再依次從後邊一個數字開始。是個暴力方法

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 1) {
            return nums.front();
        }
        int max = nums[0];
        //最大值是全局的量,每次循環不重置
        for (int i = 0; i < nums.size(); i++) {
            int data = nums[i];
            //單個元素也判斷一下,避免遺漏一個元素是最大值的情況
            if (data > max) {
                max = data;
            }
            for (int j = i + 1; j < nums.size(); j++) {
                data += nums[j];
                if (data > max) {
                    max = data;
                }
            }
        }
        return max;
    }
};

方法二:

假設在數組中的第n個下標滿足了最大的子序和,如果我們知道 n之前的n - 1個元素的最大子序和。那麼第n個下標的最大子序和

就是 n -1 下標的最大子序和和 + 下標n元素, 再和下標n元素比較得到的最大值。這樣的話一直遞推,座標 0 和座標1的最大子序和是很容易得到,依次往後計算,就可以得到結果了。

f\left ( n \right )= max(f\left ( n - 1 \right ) + nums\left [ n \right ],nums\left [ n \right ])

這裏f(n) 就代表座標n對應的最大子序和,每一個座標對應的最大子序和都有了,那麼這裏邊挑出最大的值就是整個數組的最大子序和了。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 1) {
            return nums.front();
        }
        int max_data = nums[0];
        int f_max = max_data;
        for (int i = 1; i < nums.size(); i++) {
            /// 第i個座標的之前的最大子序和
            f_max = max(f_max + nums[i], nums[i]);
            max_data = max(f_max, max_data);
        }
        return max_data;
    }
};

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章