经典问题--最大子序列和的个人简单整理

本文是对最大子序列和问题的个人整理,包括四种解决方案:穷举、优化穷举、分治策略和线性时间复杂度的算法。通过对不同思路的源码展示,帮助读者理解和应用这个问题的解法。
摘要由CSDN通过智能技术生成

前言

    最近回溯算法,对以往算法和新学习算法进行一个系统的整理和学习,本文的最大子序列和的问题在很多算法书籍和技术文章中对此都有详述,个人简单整理仅为了再次消化和日后查阅,不喜误喷。个人理解,如有错误,欢迎指正。

注:本文中提及的时间复杂度均使用大O法。

问题描述

    求-2,4,-1,5,6的最大子序列和
注:如果所有值都为负,则最大子序列和为0
思路说明

方案一

  1. 思路:使用穷举的方式,使用for循环列出所有的子序列进行求和,每次进行对比并把大的数赋值给最大子序列和变量,总共使用三个for循环
    注:i循环为从-2到6(头到尾),j循环为i到此序列size,k为计算此时i到此时j的子序列和
  2. 源码如下:

    //穷举遍历法 三个for循环时间复杂度为n*n*n 十分低效
    public static int maxSubSum1(int[] array) {
    int maxSubSum = 0;
    for (int i = 0; i < array.length; i++) {
    for (int j = i; j < array.length; j++) {
    int curSum = 0;
    for (int k = i; k <= j; k++) {
    curSum += array[k];
    if (curSum > maxSubSum) {
    maxSubSum = curSum;
    }
    }
    }
    }
    return maxSubSum;
    }

方案二

  1. 思路:maxSubSum1中k到j是前面加到后面求和,而这里是以i为指针基点,往后求和,减少一个for循环(k)时间复杂度为n*n
  2. 源码:
public static int maxSubSum2(int[] array) {
        int maxSubSum = 0;
        for (int i = 0; i < array.length; i++) {
            //tmp 变量在上面for循环每次必须重新初始化
            int tmpSum = 0;
            for (int j = i; j < array.length; j++) {
                //maxSubSum1中k到j是前面加到后面求和,而这里是以i为指针基点,往后求和
                tmpSum += array[j];
                if (tmpSum > maxSubSum) {
                    maxSubSum = tmpSum;
                }
            }
        }
        return maxSubSum;
    }

方案三

  1. 思路
        时间复杂度为nlogn的解法,使用分治策略和递归。主要把数组从中间分开,然后左边和右边递归求这两部分的最大子序列和,中间界限的最大子序列和为左边包含最接近中间的最大子序列和,以及右边包含最接近中间的最大子序列和的左右这两个最大子序列之和。最后比较这三部分的最大子序列和,其中最大的即为最大子序列和。时间复杂度为nlogn。
  2. 源码
/**
     * 递归分治算法
     * @param array
     * @return
     */
    //test      (13/2  (6/2   ( 3/2   ( 1/2  (  0  ) syso 1 ) syso 1  )  syso 0 ) ) syso 1
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值