笔试题66. LeetCode OJ (53)

来源:互联网 发布:编程教师培训 编辑:程序博客网 时间:2024/06/06 02:00

     此题是给定一个数组,找出数组中连续位置(一个区间)中所有数的和并且该和是所有区间中最大的。这个题看起来很难的样子,但是我们仔细想想的话,它的解法挺简单的!

   主要思路是使用两个临时值,cursum(用来保存当前和),maxsum(用于保存最大和),方法是。从头到尾依次相加各个数,若当前和cursum > maxsum的话,那么将cursum的值赋给maxsum;若cursum < 0 的话,说明之前的区间最大和已经找出来了且保存在maxsum中了(这一点需要想清楚),这时候应该将cursum的值赋为0,从下一个位置开始找接下来的区间中的最大和,并依此和maxsum比较,知道遍历到最后,maxsum中保存的就是整个数组的子数组中的最大和。

   这个题还有一点需要注意,那就是若数组中全部是负数的话,那么我们返回最大的负数即可,我们可以提前判断是否全部是负数,并用一个临时值保存它,最后若真是全负数的话,那么我们直接返回最大负数。代码如下:

class Solution {public:int maxSubArray(vector<int>& nums){/*查找连续的子数组,使其和最大*/int len = nums.size();if (len == 0){return 0;}else if (len == 1){return nums[0];}size_t pos = 0;  //下标int cursum = 0;  //保存最大和int maxsum = 0;  //当前和        //除去开头的负数,并且找到其中的最大的负数,若数组全为负数就要返回该值int max = nums[0]; //数组最为负数,返回最大负数while (pos < len && nums[pos] < 0){if (nums[pos] > max){max = nums[pos];}++pos;}if (pos == len){ //全为负数...return max;}//存在正数while (pos < len){cursum += nums[pos];if (cursum > maxsum){maxsum = cursum;}else if (cursum < 0){ //当前和小于0,直接从下一个位置开始计算cursum = 0;}++pos;}return maxsum;}};

最后的结果如下:


1 0