这是悦乐书的第278次更新,第294篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第146题(顺位题号是643)。给定由n个整数组成的数组,找到具有最大平均值的长度为k的连续子数组,并输出最大平均值。例如:

输入:[1,12,-5,-6,50,3],k = 4

输出:12.75

说明:最大平均值为(12-5-6 + 50)/ 4 = 51/4 = 12.75

注意:

  • 1 <= k <= n <= 30,000。

  • 给定数组的元素将在[-10,000,10,000]范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

因为是取连续的子数组,所以不需要对数组进行排序。我们可以先使用一个数组sum,长度与nums一致,将nums中的元素累加的和存起来,然后再去算k个元素之和时,使用sum中的元素做减法,找出其中的最大值,最后算出平均数即可。

public double findMaxAverage(int[] nums, int k) {
// 存放数组元素之和
int[] sum = new int[nums.length];
// 第一位就是数组的第一个元素
sum[0] = nums[0];
for (int i=1; i<nums.length; i++) {
// 从第二位开始,前i个元素之和为sum中的前一个元素与数组的当前元素
sum[i] = sum[i-1] + nums[i];
}
// 第k-1位,就是nums中0到k位元素之和
double result = sum[k-1]*1.0/k;
for (int i=k; i<nums.length; i++) {
// 计算平均值,找出最大值
result = Math.max(result, (sum[i]-sum[i-k])*1.0/k);
}
return result;
}

03 第二种解法

针对上面第一种解法,我们其实也没必要把每组元素的和存起来,只需要存一组k个元素之和即可。然后再计算其他组k个元素时,去掉前面k个元素的头部元素,并且在尾部加上新的元素,就变成了新的一组k个元素之和,就像滑动的窗户一样,窗口大小不变,首尾元素做更新。

public double findMaxAverage(int[] nums, int k) {
double sum = 0;
// 先求出前k个元素之和
for (int i=0; i<k; i++) {
sum += nums[i];
}
// 将最开始的k歌元素之和赋值给result
double result = sum;
for (int i=k; i<nums.length; i++) {
// 减去sum的左边元素,加上右边元素,变成1到k+1位元素之和
sum += nums[i]-nums[i-k];
// 比较大小,取最大
result = Math.max(result, sum);
}
return result/k;
}

04 小结

算法专题目前已日更超过四个月,算法题文章146+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Maximum Average Subarray I(Java实现)的更多相关文章

  1. LeetCode算法题-Maximum Product of Three Numbers(Java实现)

    这是悦乐书的第275次更新,第291篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第143题(顺位题号是628).给定一个整数数组,从其中找出三个数,使得乘积最大.例如: ...

  2. LeetCode算法题-Maximum Depth of N-ary Tree(Java实现)

    这是悦乐书的第261次更新,第274篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第128题(顺位题号是559).给定n-ary树,找到它的最大深度.最大深度是从根节点到 ...

  3. 【算法】LeetCode算法题-Maximum Subarray

    这是悦乐书的第154次更新,第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53).给定一个整数数组nums,找出一个最大和,此和是由数组中索引 ...

  4. LeetCode算法题-Path Sum III(Java实现)

    这是悦乐书的第227次更新 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第94题(顺位题号是437).您将获得一个二叉树,其中每个节点都包含一个整数值.找到与给定值相加的路径数 ...

  5. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  6. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

  7. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  8. LeetCode算法题-Reach a Number(Java实现)

    这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...

  9. LeetCode算法题-Shortest Completing Word(Java实现)

    这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...

随机推荐

  1. HTTPS 到底加密了什么?

    关于 HTTP 和 HTTPS 这个老生常谈的话题,我们之前已经写过很多文章了,比如这篇<从HTTP到HTTPS再到HSTS>,详细讲解了 HTTP 和 HTTPS 的进化之路,对的没错, ...

  2. nginx替换响应内容

    因为想要将非业务域名内嵌到微信小程序中,所以用到了nginx的反向代理功能来替换域名实现盗站(缘起:http://www.cnblogs.com/kenwar/p/8288882.html),但是替换 ...

  3. 使用dotnet build时复制引用dll到生成目录

    默认配置下dotnet build只会输出项目代码的dll,依赖用的是dotnet缓存中的dll,只有dotnet publish才会把依赖的dll一起输出到生成目录. 在项目csproj文件中添加以 ...

  4. Spring Cloud中服务的发现与消费

    之前没注意,微信公众号的图片不能引用到其他地方,本文图片显示不正常,原图在写完博客后已经删了,,,,,,所以本文小伙伴可以移步这里https://mp.weixin.qq.com/s/GoIZdwt5 ...

  5. 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(下)

    在上一篇(详解intellij idea 搭建SSM框架(spring+maven+mybatis+mysql+junit)(上))博文中已经介绍了关于SSM框架的各种基础配置,(对于SSM配置不熟悉 ...

  6. Docker Compose 简介

    Compose 是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用.使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建 ...

  7. Docker 网络之理解 bridge 驱动

    笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ...

  8. [二十二]JavaIO之LineNumberReader

    功能介绍 LineNumberReader是提供了行号的具体的装饰器类 跟踪行号的缓冲字符输入流 此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用 ...

  9. redis常见错误处理

    --1]当内存不足引起  redis出错 先尝试下列语句,指定redis使用内存 redis-server.exe redis.windows.conf --maxheap 200mredis-ser ...

  10. 【转载】C#将图片转换为二进制流调用

    在C#中可以使用MemoryStream类.BinaryFormatter类等来操作图片,将图片读取到二进制数据流中,最终转成二进制数据流进行调用,详细的实现如下方法所示. private byte[ ...