最大连续子序列和,以及开始、结束下标(Java)

对一个有n个元素的数组,求最大的连续子数组的和,并求其开始、结束下标。
数组的元素必然有正数也有负数才有意义,如果全是正数,那最大的子数组就是本身;如果全部为负数,那最大子数组就是空数组。
例如下面的数组,其最大子数组序列和为187,子数组为X[2,..,6]:

31-415926-535897-93-2384

先给定一个temp,让它从头开始加每个数字,temp小于0时,我们重新开始计算,另temp = 0,让开始的下标从这个位置开始。再记一个max,是我们用来存结果的,如果temp大于max,则让max = temp,让end下标移到这个位置.

public void maxSum(int[] nums) {
        int start = 0;
        int end = 0;
        int max = 0;

        int temp = 0;
        int ts = 0;
        for(int i = 0; i < nums.length; i++) {
            temp += nums[i];
            if(temp < 0) {
                ts = i + 1;
                temp = 0;
            } else {
                if(temp > max) {
                    start = ts;
                    end = i;
                    max = temp;
                }
            }
        }

        System.out.println("maxSum = " + max + ", start : " + start + ", end = " + end);
    }

时间复杂度O(N)

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
最大连续子序列的方法有两种,分别是动态规划和暴力枚举。其中动态规划的时间复杂度为O(n),而暴力枚举的时间复杂度为O(n^2)。下面分别介绍这两种方法的具体实现: 动态规划方法: 1. 初始化sum[]全为0,m初始化指向第一个数,即m=0, n初始化指向第一个数,即n=0 2. 让sum=a,m,n等于指向第一个数也就是等于0 for循环i从1取到n-1: 内部初始化变量b用于存储当前值与前一个值的最大子序列值的和 b与a[i]比较,如果b大:就将b认为当前阶段最大子序列的值,如果b小于:就认为当前阶段最大值为a[i],说明当 前值优于前面最大子序列的值,并且更新m的值等于i n的值是每次找到最大sum值的下标,因为最大子序列结束下标sum值一定大于或等于起始下标m的sum值 3. 循环结束后max的值即是最大字段和m,n是最大连续字段和的开始和结束下标。 暴力枚举方法: 1. 初始化变量max用来存储最大值,变量left和right用于存储最大字段和的起始和终止下标 2. for循环i从第1个数到第N个数: 初始化变量b用于存储从i到内层for循环j的的和 for循环j从第i个数到第N个数: b+=a[j]; 判断b和max的值进行取舍如果b>max说明当前找到最大值并且当前最大子序列从i到j,更新left和right指向 3. 当双层for循环结束后max中存储的是最大连续字段的和,left和right分别指向最大字段和的起始结束位置最大连续子序列的输出可以通过输出数组下标从left到right的元素来实现。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值