1. 程式人生 > >[Leetcode] 53. Maximum Subarray(最大子串和問題)

[Leetcode] 53. Maximum Subarray(最大子串和問題)

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

Follow up:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

題目解析:這是一個經典問題。對於一個包括負值的數字串array[1…n],要找到他的一個子串array[i…j](0<=i<=j<=n),使得在array的全部子串中。array[i…j]的和最大。

這裡我們須要注意子串和子序列之間的差別。
子串是指陣列中連續的若干個元素。而子序列僅僅要求各元素的順序與其在陣列中一致,而沒有連續的要求。對於一個元素數為n的陣列,其含有2n 個子序列和n(n+1)/2個子串。假設使用窮舉法,則至少須要 O(n2)的時間才可以得到答案。

解題思路:

  • 1 、定義兩個變數maxNum和curnum,其中maxNum儲存最終要返回的結果,即最大的子陣列之和,curnum初始值為0,每遍歷一個數字num,比較curnum + num和num中的較大值存入curnum,然後再把maxNum和curnum中的較大值存入maxNum,以此類推直到遍歷完整個陣列,可得到最大子陣列的值存在maxNum中,程式碼如下:
class Solution {
public:
   int maxSubArray(vector<int>& nums) {
       int maxnum=INT_MIN,curnum=0;
       for(auto num:nums)
       {
           curnum=max(curnum+num,num);
           maxnum=max(maxnum,curnum);
       }
       return maxnum;
   }
};

C中常量INT_MAX和INT_MIN分別表示最大、最小整數,定義在標頭檔案limits.h中。1. INT_MAX,INT_MIN數值大小
因為int佔4位元組32位,根據二進位制編碼的規則,INT_MAX = 231-1

,INT_MIN= -231.C/C++中,所有超過該限值的數,都會出現溢位,出現warning,但是並不會出現error。如果想表示的整數超過了該限值,可以使用長整型long long 佔8位元組64位。