[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位。

猜你喜欢

转载自blog.csdn.net/weixin_39116058/article/details/85723184