C#LeetCode刷题之#643-子数组最大平均数 I( Maximum Average Subarray I)
问题
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3728 访问。
给定 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]。
Given an array consisting of n integers, find the contiguous subarray of given length k that has the maximum average value. And you need to output the maximum average value.
Input: [1,12,-5,-6,50,3], k = 4
Output: 12.75
Explanation: Maximum average is (12-5-6+50)/4 = 51/4 = 12.75
Note:
1 <= k <= n <= 30,000.
Elements of the given array will be in the range [-10,000, 10,000].
示例
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3728 访问。
public class Program {
public static void Main(string[] args) {
int[] nums = null;
nums = new int[] { 1, 12, -5, -6, 50, 3 };
var res = FindMaxAverage(nums, 4);
Console.WriteLine(res);
res = FindMaxAverage2(nums, 4);
Console.WriteLine(res);
res = FindMaxAverage3(nums, 4);
Console.WriteLine(res);
Console.ReadKey();
}
private static double FindMaxAverage(int[] nums, int k) {
//暴力解法,此解法LeetCode超时未AC
if(k == 0) return 0;
double sum = 0, max_sum = int.MinValue;
for(int i = 0; i < nums.Length && i + k <= nums.Length; i++) {
sum = 0;
for(int j = i; j < i + k; j++) {
sum += nums[j];
}
max_sum = Math.Max(sum, max_sum);
}
return max_sum / k;
}
private static double FindMaxAverage2(int[] nums, int k) {
//FindMaxAverage的优化解法,不必每次计算k个数字的和
//把k当成一把尺子,从数组左边向右移动,尺子遮挡的部分看成和
//只需用之前存的和减去数组左边移出尺子的值加上数组右边移入尺子的值即为新和
if(k == 0) return 0;
double sum = 0, max_sum = int.MinValue;
//初始状态先计算前k个值的和
for(int i = 0; i < k; i++) {
sum += nums[i];
max_sum = sum;
}
for(int i = 1; i < nums.Length && i + k <= nums.Length; i++) {
//加右减左得到新和
sum += nums[i + k - 1] - nums[i - 1];
max_sum = Math.Max(sum, max_sum);
}
return max_sum / k;
}
private static double FindMaxAverage3(int[] nums, int k) {
//一种常用的数组和的解决方案
int n = nums.Length;
//创建一个新的数组记录前面所有值的和,姑且称为“和数组”
int[] sums = nums.Clone() as int[];
//从第2个(索引为1)数字开始,记录之前所有值的和
for(int i = 1; i < n; ++i) {
sums[i] = sums[i - 1] + nums[i];
}
//定义最大值为前k个数,声明为double是为了最后可以直接返回结果而不用转换
//C#或Java中,整数除以整数得到的结果还是整数,例如10 / 3 = 3,而不是 3.333333
double max = sums[k - 1];
//从k遍历“和数组”到最后,sums[i] - sums[i - k]为中间k个数字的和
for(int i = k; i < n; ++i) {
max = Math.Max(max, (double)sums[i] - sums[i - k]);
}
//返回最大平均数
return max / k;
}
}
以上给出3种算法实现,以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3728 访问。
12.75
12.75
12.75
分析:
显而易见,FindMaxAverage的时间复杂度为: ,FindMaxAverage2和FindMaxAverage3的时间复杂度为:
。
C#LeetCode刷题之#643-子数组最大平均数 I( Maximum Average Subarray I)的更多相关文章
- LeetCode 643. 子数组最大平均数 I(Maximum Average Subarray I)
643. 子数组最大平均数 I 643. Maximum Average Subarray I 题目描述 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. LeetCo ...
- 【LeetCode】643. 子数组最大平均数 I Maximum Average Subarray I (Python)
作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 目录 题目描述 题目大意 解题方法 方法一:preSum 方法二:滑动窗口 刷题心得 日期 题目地址:https://leetc ...
- [Swift]LeetCode643. 子数组最大平均数 I | Maximum Average Subarray I
Given an array consisting of n integers, find the contiguous subarray of given length k that has the ...
- Java实现 LeetCode 643 子数组最大平均数 I(滑动窗口)
643. 子数组最大平均数 I 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例 1: 输入: [1,12,-5,-6,50,3], k = 4 输出: 12.7 ...
- Leetcode 643.子数组最大平均数I
子数组最大平均数I 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例 1: 输入: [1,12,-5,-6,50,3], k = 4 输出: 12.75 解释: ...
- 力扣643.子数组最大平均数I-C语言实现
题目 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例: 输入:[1,12,-5,-6,50,3], k = 4 输出:12.75 解释:最大平均数 (12-5- ...
- C#LeetCode刷题之#852-山脉数组的峰顶索引(Peak Index in a Mountain Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4003 访问. 我们把符合下列属性的数组 A 称作山脉: A.le ...
- C#LeetCode刷题之#628-三个数的最大乘积( Maximum Product of Three Numbers)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3726 访问. 给定一个整型数组,在数组中找出由三个数组成的最大乘 ...
- C#LeetCode刷题之#414-第三大的数(Third Maximum Number)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3710 访问. 给定一个非空数组,返回此数组中第三大的数.如果不存 ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
随机推荐
- J.U.C体系进阶(四):juc-sync 同步器框架
Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-sync 同步器框架 同步器名称 作用 CountDownLatch 倒 ...
- 动手实现一个较为简单的MQTT服务端和客户端
项目地址:https://github.com/hnlyf168/DotNet.Framework 昨天晚上大致测试了下 ,490个客户端(一个收一个发) 平均估计每个每秒60个包 使用mqtt协 ...
- Arrays.sort() ----- DualPivotQuicksort
Arrays.sort() ----- DualPivotQuicksort DualPivotQuicksort是Arrays.sort()对基本类型的排序算法,它不止使用了双轴快速排序,还使用了T ...
- 服务质量分析:腾讯会议&腾讯云Elasticsearch玩出了怎样的新操作?
导语 | 腾讯会议于2019年12月底上线,两个月内日活突破1000万,被广泛应用于疫情防控会议.远程办公.师生远程授课等场景,为疫情期间的复工复产提供了重要的远程沟通工具.上线100天内,腾讯会议快 ...
- 基于Scrapy的B站爬虫
基于Scrapy的B站爬虫 最近又被叫去做爬虫了,不得不拾起两年前搞的东西. 说起来那时也是突发奇想,想到做一个B站的爬虫,然后用的都是最基本的Python的各种库. 不过确实,实现起来还是有点麻烦的 ...
- jmeter接口测试 -- 数据库操作(mysql)
一.操作类型 语句类型 1.查询语句 2.非查询语句 1)update 2)insert into 3)删除 二.把返回值的化为变量 1.执行语句,并引用变量 2.查看结果
- 中科大数分教材:用阶乘倒数和计算e值的误差和e是无理数的证明,用到误差计算
\(e=lim_{n \to \infty}e_{n}(1+\frac{1}{n})^n\\\) \(=\lim_{n \to \infty}(\frac{1}{0!}+\frac{1}{1!}+\f ...
- 修改alpine Linux的Docker容器的时区
适用对象 使用 Alpine Linux 发行版的 Docker 镜像容器. 仅仅适用于没有安装uclibc的系统. 修改步骤 进入容器命令行 # docker exec -it container_ ...
- Android系统前台进程,可见进程,服务进程,后台进程,空进程的优先级排序
1.前台进程 前台进程是Android中最重要的进程,在最后被销毁,是目前正在屏幕上显示的进程和一些系统进程,也就是和用户正在交互的进程. 2.可见进程 可见进程指部分程序界面能够被用户看见,却不在前 ...
- IO—》转换流和缓冲流
转换流 摘要: InputStreamReader和OutputStreamWriter他们分别是FileReader和FileWriter的父类 当只是单纯的读写文件而不改变文件的编码格式时,就分别 ...