LeetCode解题报告 53. Maximum Subarray [medium]

来源:互联网 发布:贝叶斯网络分析软件 编辑:程序博客网 时间:2024/04/27 11:35

题目描述

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

Example: given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

解题思路

简而言之一句话意思就是,寻找最大序列和的子序列。
最直接简单的思路肯定是不行的,时间复杂度过大。这里算法的分类是分治算法,对于分治我的思路大概是,将原数组从中点二分,那么最大子数列一定存在于左半部分数列,右半部分数列,或者横跨左右两半。需要分别计算三种分组中的最大子序列的和,并进行比较。将原序列不断一分为二,变成更小的序列,最后的子序列只剩一个元素,然后再一步步递推上去,就能找到最大的子序列。
想到分治算法的实现要用到递归,就想有没有更简单的实现方法,可以想到如果从左到右依次扫描一遍,时间复杂度只需O(n),那么实现的思路是,每扫描一个数后进行判断临时的前几个数字的数字和,如果和值是大于0的,那么说明这几个数对总的最大和是有贡献的,可以保留;如果小于0,则一定会减少最大和,也就是做出负贡献,那么就将这几个和为负数的都删去,给临时和重新赋值当前的这个数字。与此同时,记录每次的最大和,判断最大和和临时和哪个更大,因为有可能删去的那几个负数和之后,剩余的数字都是负数,并且比这个负数和更小,那么之前已经记录过的最大和仍然能显示最大和。

代码如下:
class Solution {public:    int maxSubArray(vector<int>& nums) {        int tempsum=nums[0];        int allmax=nums[0];        for (int i=1; i<nums.size(); i++) {            if (tempsum<0) {                tempsum=nums[i];                if (allmax>tempsum) {                    allmax=allmax;                }                else                    allmax=tempsum;                                //cout << tempsum << allmax << endl;            }            else if (tempsum>=0) {                tempsum=tempsum+nums[i];                if (allmax>tempsum) {                    allmax=allmax;                }                else                    allmax=tempsum;                                //cout << tempsum << allmax << endl;            }        }        return allmax;    }};

0 0
原创粉丝点击