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