栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

剑指offer之连续子数组的最大和(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指offer之连续子数组的最大和(C++)

题目

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
要求:时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)
进阶:时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1)

思路
代码

分治策略解法

class Solution {
public:
    int FindMaxCrossingSubArray(vector& array, int low, int mid, int high,
                                int& max_left, int& max_right)
    {
        int left_sum = -10000;
        int sum = 0;
        int right_sum = -10000;
        int maxValue= 0;
        for (int i = mid; i >= low; i--)
        {
            sum += array[i];
            if (sum > left_sum)
            {
                left_sum = sum;
                max_left = i;
            }
        }
        sum = 0;
        for (int j = mid + 1;  j <= high; j++)
        {
            sum += array[j];
            if (sum > right_sum)
            {
                right_sum = sum;
                max_right = j;
            }
        }
        maxValue = left_sum + right_sum;
        return maxValue;
    }
    
    void FindMaximunSubarray(vector& array, int low, int high, int& index_left
                             , int& index_right, int& maxValue)
    {
        int left_low = 0, left_high = 0, left_sum = 0;
        int right_low = 0, right_high = 0, right_sum = 0;
        int cross_low = 0, cross_high = 0, cross_sum = 0;
        int mid = 0;
        if (low == high)
        {
            index_left = low;
            index_right = high;
            maxValue = array[low];
        }
        else
        {
            mid = (low + high) / 2;
            FindMaximunSubarray(array, low, mid, left_low, left_high, left_sum);
            FindMaximunSubarray(array, mid+1, high, right_low, right_high, right_sum);
            cross_sum = FindMaxCrossingSubArray(array, low, mid, high, cross_low, cross_high);
            if (left_sum >= right_sum && left_sum >= cross_sum)
            {
                index_left = left_low;
                index_right = left_high;
                maxValue = left_sum;
            }
            else if (right_sum >= left_sum && right_sum >= cross_sum)
            {
                index_left = right_low;
                index_right = right_high;
                maxValue = right_sum;
            }
            else
            {
                index_left = cross_low;
                index_right = cross_high;
                maxValue = cross_sum;
            }
            
        }
    }
    
    int FindGreatestSumOfSubArray(vector array) {
        int left = 0, right = 0, sum = 0;
        FindMaximunSubarray(array, 0, array.size() - 1, left, right, sum);
        return sum;
    
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836300.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号