【LeetCode】813. 最大平均值和的分组

news2024/11/26 2:37:47

题目描述

给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个相邻的非空子数组 。 分数 由每个子数组内的平均值的总和构成。
注意我们必须使用 nums 数组中的每一个数进行分组,并且分数不一定需要是整数。
返回我们所能得到的最大 分数 是多少。答案误差在 10-6 内被视为是正确的。

示例 1:

输入: nums = [9,1,2,3,9], k = 3
输出: 20.00000
解释:
nums 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + 3) / 3 + 9 = 20.
我们也可以把 nums 分成[9, 1], [2], [3, 9].
这样的分组得到的分数为 5 + 2 + 6 = 13, 但不是最大值.

示例 2:

输入: nums = [1,2,3,4,5,6,7], k = 4
输出: 20.50000

提示:

1 <= nums.length <= 100
1 <= nums[i] <= 104
1 <= k <= nums.length

方法一:维护前缀和 + 序列DP

class Solution {
public:
    double largestSumOfAverages(vector<int>& nums, int k) {
        int n = nums.size();
        // 前缀和数组 
        vector<double> sum(n + 5);
        for(int i=1; i<=n; i++){
            sum[i] = sum[i-1] + nums[i-1];
        }
        vector<vector<double>> score(n + 10, vector<double>(k + 10));

        for(int i=1; i<=n; i++){
            for(int j=1; j<=min(i, k); j++){
                if(j == 1){
                    // 分为1份
                    score[i][1] = sum[i] / i;
                }
                else{
                    // 分为多份,递推考虑
                    // m是指最后一个子数组的起点,取2和j的最大值
                    // 因为j是当前最少需要的份数
                    // eg:i=4,j=3 如果此时m=2,没有意义,
                    // 2如果是最后一个子数组的起点,那么最多只能分为2份
                    for(int m=max(2, j); m<=i; m++){
                        score[i][j] = max(score[i][j], score[m-1][j-1] + (sum[i] - sum[m-1]) / (double)(i - m + 1));                        
                    }
                }
            }
        }


        return score[n][k];
    }
};

心得
这道题一开始没注意到 邻近 两个字,因此我一开始的思路是错的 「将数组 nums sort降序排序,前 k-1 个元素各占一份, 后面的元素作为第 k 份」,由于忽略了 『邻近』的条件,这个方法只能通过大约一半的测试点。

方法:前缀和 + 序列DP

  • 题意可以理解为:「将 n 个元素划分为最多 m 个连续段,最大化连续段的平均值之和」。

  • 为了方便,令所有数组的下标从 1 开始。
    定义 「 f[i][j] 为考虑将前 i 个元素划分为 j 份的最大平均和 」,答案为 f[n][k] ,其中 1 <= k <= m。

  • 接下来考虑 f[i][j] 的计算,由于划分出来的子数组不能是空集,因此可以根据 j 的大小分情况讨论:

    • 当 j = 1 时,
      此时 f[i][j] = (∑ nums[inx- 1]) / i;
    • 当 j > 1 时,此时枚举最后一个子数组的起点 k ,其中 2 <= k <= i,此时有平均值之和为:
      在这里插入图片描述
      最终 f[i][j] 为枚举所有k 值的最大值。
  • 其中 求解连续段之和可以用 前缀和 进行优化。同时,想要简化代码,还可以利用一个简答的数学结论:「 划分份数越多,平均值之和越大,因此想要取得最大值必然是恰好划分成 m 份」。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eclipse中创建的Maven Module和Maven Project及其间区别

eclipse中创建Maven Module和Maven Project及其间的区别Maven Module和Maven ProjectProject和Module的关系及用法Maven Module工程必须有父工程Maven Module和Maven Project Maven Project可以理解为父工程&#xff0c;是最上级的项目&#xff0c;一般没有其他parent项目。是一…

Word控件Spire.Doc 【图像形状】教程(6): 如何在 C#、VB.NET 的 Word 文档中插入形状和形状组

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

天河超算,安装Hypre

1)下载&#xff0c;解压 略 得到目录&#xff1a;hypre-master 源文件在src目录下面 src包含如下目录&#xff1a; 2&#xff09;cmake编译 版本比较新 HYPRE_RELEASE_NAME hypre HYPRE_RELEASE_VERSION 2.26.0 HYPRE_RELEASE_DATE 2022/10/14 HYPRE_RELEASE_TIM…

CT正投影算法归纳

一、CT重建基本原理 CT 系统成像基本模型可以描述成&#xff1a;   f为待重建图像&#xff0c;P为投影数据&#xff0c;W为系统矩阵&#xff0c;其中&#xff0c;投影矩阵反映探测器上的投影与重建物体的关系&#xff0c;其模型刻画对于重建速度和精度有着重要影响。 二、…

Java:多线程基础(一)-创建线程的两种方式

目录 线程与进程 Thread类 创建线程的两种方式 方式1&#xff1a;继承Thread类 方式2&#xff1a;实现Runnable接口 * 方式2延伸&#xff1a;实现Callable接口 Callable接口 Futuretask类 返回线程计算结果&#xff1a;get() Callable&#xff1a;创建子线程…

Redis实战之共享session + jwt 实现登录拦截、刷新token

共享session问题 每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat&#xff0c;并且把自己的信息存放到第一台服务器的session中&#xff0c;但是第二次这个用户访问到了第二台tomcat&#xff0c;那么在第二台服务器上&#xff0c;肯定没有第一台服务器…

百度边止血边扩张

在经过一系列的“内部调整”之后&#xff0c;百度交出了一份超预期的财报。北京时间11月22日&#xff0c;百度发布了截至2022年9月30日的第三季度财务报告。第三季度&#xff0c;百度实现营收325.4亿元&#xff0c;同比增长2%&#xff1b;归属百度的净利润&#xff08;non-GAAP…

在线杂志小程序开发,开启在线阅读时代

互联网技术的快速发展&#xff0c;让人们越来越依赖从网络上查看各种新闻资讯。传统的纸质杂志已经很难顺应时代的发展脚步&#xff0c;但是人们对于杂志的需求并没有减少。因此为了更好的满足众多读者对于杂志的需求&#xff0c;开发在线杂志小程序是十分必要的。在线杂志阅读…

时光倒流-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第88讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

医院预约小程序源码,挂号陪护就医功能,提供全方位服务

随着人口老龄化形式加剧&#xff0c;年轻人工作压力大&#xff0c;没有闲余时间陪伴父母老人&#xff0c;因此针对解决独自去医院排队以及现代化设备需要等要求&#xff0c;而衍生出来的一个新型行业-挂号陪护。医院预约小程序源码开发的出现无非就是解决了这一难题&#xff0c…

教培行业迎来重大变局,三大方向或成新机遇

“双减”政策落地&#xff0c;教培行业迎来重大变局。校内教育深化改革正在路上&#xff0c;而学科类机构或将踏上转型之路&#xff0c;结合政策和市场来看&#xff0c;素质教育类、职业教育类、教育数字化3大方向或成新机遇。 “双减”的总体思路是什么呢&#xff1f; 教育部有…

[附源码]计算机毕业设计SpringbootON-FIT

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

QGIS下载在线地图(Google 卫星、esri 卫星)

前言 国内外有很多在线地图下载软件&#xff0c;但功能单一&#xff0c;基本上只能下载数据&#xff0c;无法做GIS分析&#xff0c;且多为收费&#xff0c;即便是免费&#xff0c;也多少有所限制。 在QGIS中&#xff0c;可以完全免费且迅速下载在线地图&#xff0c;首先请看阅…

Kafka集群环境的部署

Kafka集群环境的搭建一、Kafka集群二、搭建两台服务器2.1、 zookeeper部署2.2、 启动1号机器的broker2.3、 启动2号机器的broker2.4、查看kafka集群2.5、测试集群总结后言一、Kafka集群 二、搭建两台服务器 笔者的两台服务器IP&#xff1a; 服务器IP1号192.168.11.592号192.1…

matplotlib你真的明白plt,fig和ax吗

你真的明白plt&#xff0c;fig和ax吗&#xff1f; plt系列接口是用来模仿MATLAB的风格的。如果用户熟悉MATLAB&#xff0c;还是建议以plt为主的。对于基本的画图&#xff0c;plt系列足够了。 个人觉得&#xff0c;真正不合适的用法&#xff0c;反而是各种混淆plt接口和其它更细…

单目相机模型

针孔相机模型 针孔相机模型是实际研究中最常用的模型。针孔是一个中间有一个小孔的假想墙壁&#xff0c;光只能从小孔通过。 fff是摄像机焦距&#xff0c;ZZZ是摄像机到物体的距离&#xff0c;XXX是物体长度&#xff0c;是图像平面上的物体长度。由相似三角形可得&#xff1a…

护眼灯真的可以保护眼睛吗?市面上的护眼台灯到底是不是智商税

护眼灯能不能保护眼睛&#xff0c;护眼灯是不是智商税&#xff0c;这是很多人一直以来都有的疑惑&#xff0c;其实啊&#xff0c;这并不难判断&#xff0c;直接入手体验一下就知道了&#xff0c;有没有护眼效果&#xff0c;照明体验是否舒适&#xff0c;一试便知。 护眼灯怎样…

Java解决鸡兔同笼问题

1 问题 利用java程序&#xff1a;输入鸡和兔的总数和总腿数&#xff0c;来计算兔子和鸡的各个数量。 2 方法 import java.util.Scanner; /** * 已知鸡和兔的总数量为n,总腿数为m。 * 输入n和m,依次输出鸡和兔的数目&#xff0c; * 如果无解&#xff0c;则输出“No answer” */ …

[漏洞复现]Text4shell(CVE-2022-42889)

文章目录简介影响版本环境搭建漏洞复现漏洞修复参考简介 Apache Commons Text 项目实现了一系列关于文本字符串的算法&#xff0c;专注于处理字符串和文本块。10月13日&#xff0c;Apache发布安全公告&#xff0c;修复了Apache Commons Text中的一个远程代码执行漏洞&#xff…

GJB 5000B简介

“软件定义装备”是武器装备信息化职能化发展的比如趋势,J用软件在信息化战争和J事智能化进程中起着基础性决定性作用。 1、GJB 5000由来 1991年 推出CMM 目的:用来衡量组织软件综合能力 2000年,SEI发布CMMIV1.0(Capability Maturity Model Integration)能力成熟度模型集…