编程之美_011求数组的子数组之和的最大值

本文介绍了一种在O(n)时间内求解给定数组中最大子数组和的方法,通过优化遍历策略,避免了传统的三层或二层循环带来的效率低下。详细解释了两种算法实现,并附上代码实例,旨在提升对动态规划和滑动窗口概念的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 输入一个整形数组,数组里有正数也有负数。
// 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
// 求所有子数组的和的最大值。要求时间复杂度为O(n)。
public class Test
{
    static int[] arr =
    {
            1, -2, 3, 10, -4, 7, 2, -5
    };// 需要求的数组
    static int maxIndex = arr.length - 1;// 数组的最大下标

    public static void main(String[] args)
    {
        findMaxArr2();
        System.out.println("\n-------------");
        findMaxArr3();
    }

    // 1.三层for循环求解
    // 2.二层for循环求解
    static void findMaxArr2()
    {
        int max = arr[0];// 最大值
        int sum;// 求和
        int startIndex = 0;
        int endIndex = 0;
        for (int i = 0; i <= maxIndex; i++)
        {
            sum = 0;
            for (int j = i; j <= maxIndex; j++)
            {
                sum += arr[j];
                if (sum > max)
                {
                    max = sum;
                    startIndex = i;
                    endIndex = j;
                }
            }
        }
        System.out.println("最大值为:" + max);
        printArr(startIndex, endIndex);
    }

    // 3.时间复杂度为n
    static void findMaxArr3()
    {
        int max = arr[0];// 最大值
        int sum = 0;// 求和
        int startIndex = 0;
        int endIndex = 0;
        for (int i = 0; i <= maxIndex; i++)
        {
            if (sum >= 0)
            {
                sum += arr[i];
            }
            else
            {
                sum = arr[i];
                startIndex = i;// 最大子数组开始值
            }
            if (sum > max)
            {
                max = sum;
                endIndex = i;// 最大子数组结束值
            }
        }
        System.out.println("最大值为:" + max);
        printArr(startIndex, endIndex);
    }

    // 根据下标开始结束值,打印数组
    static void printArr(int startIndex, int endIndex)
    {
        for (int i = startIndex; i <= endIndex; i++)
        {
            System.out.print(arr[i] + " ");
        }
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值