求连续子序列最大和

给定一个无序数组,求最大的连续子数组的和

解法一:
  • 思路:暴力解法,最大序列肯定以数组中某个数为起点,则依次遍历以每个点为起点的情况
  • 时间复杂度:O(n平方)
int maxSubSequence1(vector<int> A, int n) {
    int max = INT_MIN;
    for (int i = 0; i < n; i++) {
        int tempSum = 0;
        for (int j = i; j < n; j++) {
            tempSum += A[j];
            max = tempSum > max ? tempSum : max;
        }
    }
    return max;
}
解法二:
  • 思路:分治思想,结果有三种情况:

    • 情况1:最大子序列在左边部分
    • 情况2:最大子序列在右边部分
    • 情况3:最大子序列横跨左右两个部分

    然后每次递归过程都返回三者最大即可

  • 时间复杂度:O(nlogn)

int maxForThree(int A, int B, int C) {
    if (A >= B && A >= C) {
        return A;
    }
    return maxForThree(B, C, A);
}

int maxSubSequence2(vector<int> A, int left, int right) {
    if (left == right) {
        return A[left];
    }

    int middle = left + (right - left)/2;
    
    // 左半部分
    int leftSum = 0;
    int leftMax = INT_MIN;
    for (int i = middle; i >= 0; i--) {
        leftSum += A[i];
        leftMax = leftSum > leftMax ? leftSum : leftMax;
    }
    
    // 右半部分
    int rightSum = 0;
    int rightMax = INT_MIN;
    for (int i = middle + 1; i < A.size(); i++) {
        rightSum += A[i];
        rightMax = rightSum > rightMax ? rightSum : rightMax;
    }
    
    return maxForThree(leftMax + rightMax, maxSubSequence2(A, left, middle), maxSubSequence2(A, middle + 1, right));
}
解法三:
  • 思路:调整思考角度,暴力解法核心是最大子序列一定是以数组中某个数为起点,转变思维,最大子序列也一定是以数组中某个数为终点
  • 时间复杂度:O(n)
int maxSubSequence3(vector<int> A, int n) {
    int tempMax = A[0]; // 以该数结尾的序列的最大和
    int resultMax = A[0];
    for (int i = 1; i < n; i++) {
        
        if (tempMax < 0) {
            tempMax = A[i];
        } else {
            tempMax += A[i];
        }
        
        resultMax = tempMax > resultMax ? tempMax : resultMax;
        
    }
    return resultMax;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 最大连续子序列问题 问题定义: 给定K个整数的序列{ N1, N2, ..., Nk },其任意连续子序列可表示为...
    HITMiner阅读 16,726评论 3 8
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 8,651评论 0 19
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 11,120评论 0 19
  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,929评论 0 160
  • “故善为道者,先合道而不悖,次则适道而不违”每一个行业里的大师都是需要先知道该行业的一些规则,然后把规则熟悉后,添...
    洋葱de心无旁骛阅读 1,535评论 0 0

友情链接更多精彩内容