今日头条-最大区间问题Java求解

该博客介绍了如何使用Java解决最大区间问题,通过分治策略找出问题的关键点——输入值为0和输入结束,将数组切割并求解每个子数组的最小值乘以子数组长度。文章指出需要注意数组顺序,并提供了实现代码,已通过牛客网的所有测试用例。

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

今日头条-最大区间问题Java求解


问题:
给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:
区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。
如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:
[6] = 6 * 6 = 36;
[2] = 2 * 2 = 4;
[1] = 1 * 1 = 1;
[6,2] = 2 * 8 = 16;
[2,1] = 1 * 3 = 3;
[6, 2, 1] = 1 * 9 = 9;
从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。
区间内的所有数字都在[0, 100]的范围内;
输入描述:
第一行输入数组序列长度n,第二行输入数组序列。
对于 50%的数据, 1 <= n <= 10000;
对于 100%的数据, 1 <= n <= 500000;
输出描述:
输出数组经过计算后的最大值。

    输入例子1:
    3
    6 2 1

    输出例子1:
    36

思路:

  1. 从分治角度思考,先找出问题的分水岭在输入值为0和输入值结束时,即通过出现0(因为出现0的情况必定使输出结果为0,所有可以跳过)或输入结束两种判断,将输入数组切割成多份
  2. 接下来问题就变成从每个切割数组中读取最小值*切割数组和的问题了
  3. 另外要注意数组有顺序问题,笔者一开始没注意看,以为是可以跳过数组数字的问题,导致写的时候出现一些问题

开始上代码:
import java.util.Scanner;

public class MaxSum {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int count = Integer.parseInt(sc.nextLine());
        String[] arr = sc.nextLine().split("\\s+");

        int left = 0;//左边界
        int right = 0;//右边界
        long max = Long.parseLong(arr[0])*Long.parseLong(arr[0]);//最大值

        while (right < count){
            long node = Long.parseLong(arr[right]);
            if (node == 0 || right == count - 1){
                for (int i = left; i <= right; i++){
                    long tmp = Long.parseLong(arr[i])*Long.parseLong(arr[i]);
                    long min = Long.parseLong(arr[i]);
                    if (tmp > max)
                        max = tmp;
                    if (i != right){
                        long sum = Long.parseLong(arr[i]);
                        for (int j = i+1; j <= right; j++){

                            if (min > Long.parseLong(arr[j]))
                                min = Long.parseLong(arr[j]);
                            sum += Long.parseLong(arr[j]);

                            tmp = sum * min;
                            if (tmp > max)
                                max = tmp;

                        }
                    }


                }
                left = right + 1;
            }

            right++;

        }
        System.out.println(max);



    }
}


在牛客网跑了一下,是可以通过所有测试用例的,先记录一些,日后有时间再进行优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值