几何平均值最大子数组

几何平均值最大子数组问题 说明:有多个长度至少为 2 的子数组的几何平均值为 0.2,其中长度最短的为 2,并且有多个这样长度为 2 且几何平均值为 0.2 的子数组,最前面的那个是从第二个数开始的两个 0.2 组成的子数组。要是有多个长度相同且几何平均值都是最大值的子数组,就输出最前面的那个子数组。在一个正数数组的实际应用场景里,例如在金融数据分析中,可能会有一系列的正数数据代表不同时间段的收益率。用例保证除几何平均值为最大值的子数组外,其他子数组的几何平均值至少比最大值小最大值的。,我们的任务是从这个数组里找出长度至少为。 阅读详情

题目描述

从一个长度为N的正数数组numbers中找出长度至少为L且 几何平均值 最大的子数组,并输出其位置和大小。
(K个数的 几何平均值 为K个数的乘积的K次方根)
若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组。
若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组。

输入描述

  • 第一行输入为N、L
    • N表示numbers的大小 1≤N≤1000001\le N\le 1000001≤N≤100000
    • L表示子数组的最小长度 1≤L≤N1\le L\le N1≤L≤N
  • 之后的N行表示numbers中的N个数,每个一行10−9≤numbers[i]≤10910^{-9} \le numbers[i] \le 10^910−9≤numbers[i]≤109

输出描述

  • 输出子数组的位置(从 0 开始计数)和大小,中间用一个空格隔开。

备注

  • 用例保证除几何平均值为最大值的子数组外,其他子数组的几何平均值至少比最大值小10−1010^{-10}10−10倍数。

用例

用例1

  • 输入
3 2
2
2
3
  • 输出
1 2
  • 说明
  • 长度至少为 2 的子数组共 3 个,分别是 {2, 2}、{2, 3}、{2, 2, 3}
  • 其中{2, 3}的几何平均值最大,故输出其位置 1 和 长度2

用例2

  • 输入
10 2

0.2
0.1
0.2
0.2
0.2
0.1
0.2
0.2
0.2
0.2
  • 输出
2 2
  • 说明
  • 有多个长度至少为 2 的子数组的几何平均值为 0.2,其中长度最短的为 2,也有多个。
  • 长度为 2 且几何平均值为 0.2 的子数组最前面的那个为第二个数开始的两个 0.2 组成的子数组

代码展示

    private static void maxGeoSubArray(double[] numbers, int L) {
        // 首先构造前缀积数组
        int n = numbers.length;
        double[] mul = new double[n+1];
        // 初始化第一个元素 为 0
        mul[0] = 1.0;

        // 填充前缀积数组数据
        for(int i = 0;i < n;i++) {
            mul[i + 1] = mul[i] * numbers[i];
        }

        // 初始化左右边界变量
        int l = 0,r = 0;
        // 保存最大值
        double ans = 0.0;

        //  双重遍历,去找到 最大几何平均值
        for(int i = 0;i <= n - L;i++) {
            for(int j = i + L - 1;j < n;j++) {
                // 这个时候,计算区间  [i, j] 的几何平均值 j - i + 1
                double t = mul[j+1] / mul[i];
                int len = j - i + 1;
                //  开  len 次方根
                double avg = Math.pow(t, 1.0 / len);

                // 根据备注要求,几何平均值的大小至少要保证比最大值 小 10^{-10} 次方倍
                if(Math.abs(avg - ans) > Math.max(avg, ans) / Math.pow(10, 10) && avg >= ans) {
                    if(avg == ans) {
                        int local = r - l + 1;
                        if(len > local) {
                            r = j;
                            l = i;
                        }
                    } else {
                        ans = avg;
                        r = j;
                        l = i;
                    }
                }
            }
        }

        // 最终遍历最后然后输出结果   输出  位置 和 长度
        System.out.print(l + " ");
        System.out.print(r - l + 1);
    }
【华为OD机试真题 Python】几何平均值最大的子数组 从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大子数组,并输出其位置和大小。(K个数的几何平均值为K个的乘积的K次方根)第一行输入为N、L,N表示numbers的大小 (1 阅读详情

相关推荐

【华为OD机试真题2023 JAVA&JS】几何平均值最大子数组

几何平均值最大子数组 时间限制:1s空间限制:256MB限定语言:不限 题目描述:从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大子数组,并输出其位置和大小。(K个数的几何平均值为K个数的乘积的K次方根)若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组。若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组。

qq_34465338的博客 4126

新手学习期--刷题:几何平均值最大子数组

【华为OD机试真题 Python】几何平均值最大的子数组 思路:1、找出长度符号的子数组;2、找出子数组的几何平均值;3、找出最大值;4、找出最大值的位置何长度

2302_78067060的博客 290

【华为OD机考真题】- 几何平均值最大子数组(Java)

🔔本文收录于「2025华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

**My Coding Family** 1424

【首发独家】华为OD机试 - 几何平均值最大子数组(GO 语言解题)

有多个长度至少为 2 的子数组的几何平均值为 0.2,其中长度最短的为 2,也有多个,长度为 2 且几何平均值为 0.2 的子数组最前面的那个为从第二个数开始的两个 0.2 组成的子数组。第一行输入为 N、L,N 表示 numbers 的大小(1

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 2482

【100分】【几何平均值最大子数组】

第一行输入为N、L,N表示numbers的大小(1

weixin_54707168的博客 377

【华为OD】几何平均值最大子数组_ [二分查找+前缀和]

因此,在求解 长度大于等于 k 的子序列时,我们不能在沿用 leetcode 644 的解法,leetcode 644 解法如下。本题和 leetcode 644 的区别在于,leetcode 644 求解的长度大于等于 k 的 最大算术平均值 的。连续子序列,而本题求解的是 长度大于等于 k 的 最大几何平均值 的连续子序列。若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组。若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组。.L 表示子数组的最小长度 (1

buff会技术的程序媛de博客 1260

几何平均值最大子数组 思路+代码(华为OD-A卷-200分-Python解法)

之后N行表示numbers中的N个数,每个一行(10^-9 ≤ numbers[i] ≤ 10^9)之后N行表示numbers中的N个数,每个一行(10^-9 ≤ numbers[i] ≤ 10^9)之后N行表示numbers中的N个数,每个一行(10^-9 ≤ numbers[i] ≤ 10^9)之后N行表示numbers中的N个数,每个一行(10^-9 ≤ numbers[i] ≤ 10^9)之后N行表示numbers中的N个数,每个一行(10^-9 ≤ numbers[i] ≤ 10^9)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 722

【华为OD机试真题2023 JS】几何平均值最大子数组

几何平均值最大子数组 时间限制:1s空间限制:256MB限定语言:不限 题目描述:从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大子数组,并输出其位置和大小。(K个数的几何平均值为K个数的乘积的K次方根)若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组。若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组。

weixin_40767375的博客 316

【100%通过率】华为OD机试真题 C 实现【几何平均值最大子数组】【2023 Q1 | 200分】

从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大子数组,并输出其位置和大小。(K个数的几何平均值为K个数的乘积的K次方根)若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组,若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组。

MISAYAONE的博客 8485

【100%通过率】华为OD机试真题 C++ 实现【几何平均值最大子数组】【2023 Q1 | 100分】

从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大子数组,并输出其位置和大小。(K个数的几何平均值为K个数的乘积的K次方根)若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组,若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组。

MISAYAONE的博客 2万+

【100%通过率】华为OD机试真题 Java&Go 实现【几何平均值最大子数组】【2023 Q1 | 100分】

从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大子数组,并输出其位置和大小。(K个数的几何平均值为K个数的乘积的K次方根)若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组,若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组。

MISAYAONE的博客 2万+

华为OD机试用Python实现 -【几何平均值最大子数组】| 2023年3月被抽中

几何平均值最大子数组有多个长度至少为 2 的子数组的几何平均值为 0.2,其中长度最短的为 2,也有多个,长度为 2 且几何平均值为 0.2 的子数组最前面的那个为从第二个数开始的两个 0.2 组成的子数组。第一行输入为 N、L,N 表示 numbers 的大小(1

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 3652

华为OD机考2025A卷 - 几何平均值最大子数组(200分)

华为OD2025A卷真题 几何平均值最大子数组 提供Java、C++、Python、Go、JavaScript源码实现

qq_45776114的博客 637

【华为OD B卷】| 几何平均值最大子数组

华为OD B卷

buff会技术的程序媛de博客 80

【华为OD机试真题 C++】几何平均值最大的子数组

从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大子数组,并输出其位置和大小。(K个数的几何平均值为K个的乘积的K次方根) 若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组。 若有多个长度相同的子数组的几何平均值均最大值,则输出最前面的子数组。

A_D_I_D_A_S的博客 518

【华为OD机试真题 Python语言】206、几何平均值最大子数组 | 机试真题+思路参考+代码分析

从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大子数组,并输出其位置和大小。(K个数的几何平均值为K个数的乘积的K次方根) >  若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组 >  若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组

KJ.JK 4631
上一篇: 函数计算服务-基本概念篇
下一篇: HCIP学习笔记-华为云运维方案-9
隙间光点
博客等级 码龄10年 29粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值