问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 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)的更多相关文章

  1. LeetCode 643. 子数组最大平均数 I(Maximum Average Subarray I)

    643. 子数组最大平均数 I 643. Maximum Average Subarray I 题目描述 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. LeetCo ...

  2. 【LeetCode】643. 子数组最大平均数 I Maximum Average Subarray I (Python)

    作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 目录 题目描述 题目大意 解题方法 方法一:preSum 方法二:滑动窗口 刷题心得 日期 题目地址:https://leetc ...

  3. [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 ...

  4. Java实现 LeetCode 643 子数组最大平均数 I(滑动窗口)

    643. 子数组最大平均数 I 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例 1: 输入: [1,12,-5,-6,50,3], k = 4 输出: 12.7 ...

  5. Leetcode 643.子数组最大平均数I

    子数组最大平均数I 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例 1: 输入: [1,12,-5,-6,50,3], k = 4 输出: 12.75 解释: ...

  6. 力扣643.子数组最大平均数I-C语言实现

    题目 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例: 输入:[1,12,-5,-6,50,3], k = 4 输出:12.75 解释:最大平均数 (12-5- ...

  7. C#LeetCode刷题之#852-山脉数组的峰顶索引(Peak Index in a Mountain Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4003 访问. 我们把符合下列属性的数组 A 称作山脉: A.le ...

  8. C#LeetCode刷题之#628-三个数的最大乘积( Maximum Product of Three Numbers)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3726 访问. 给定一个整型数组,在数组中找出由三个数组成的最大乘 ...

  9. C#LeetCode刷题之#414-第三大的数(Third Maximum Number)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3710 访问. 给定一个非空数组,返回此数组中第三大的数.如果不存 ...

  10. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

随机推荐

  1. Ethical Hacking - Web Penetration Testing(10)

    SQL INJECTION SQLMAP Tool designed to exploit SQL injections. Works with many DB types, MySQL, MSSQL ...

  2. Python Ethical Hacking - BACKDOORS(7)

    Handling Errors: If the client or server crashes, the connection will be lost. Backdoor crashes if: ...

  3. .NET Core ResponseCache【缓存篇(一)】

    一.前言 源码   1.最近一直在看项目性能优化方式,俗话说的好项目优化第一步那当然是添加缓存,我们的项目之所以卡的和鬼一样,要么就是你的代码循环查询数据库(这个之前在我们的项目中经常出现,现在慢慢在 ...

  4. P1100 高低位切换

    这个题很简单 直接用左移位(<<)和右移位(>>)就可以过了 #include<iostream> #include<cstdio> using nam ...

  5. 设计模式:command模式

    目的:将命令设计成类的形式,并可以组织成队列 优点: 在需要的情况下,可以比较容易地将命令记入日志 可以容易的实现对请求的撤销和重做 由于新的具体命令类不影响其他的命令类,因此增加新的具体命令类很容易 ...

  6. 感知机算法(PLA)代码实现

    目录 1. 引言 2. 载入库和数据处理 3. 感知机的原始形式 4. 感知机的对偶形式 5. 多分类情况-one vs. rest 6. 多分类情况-one vs. one 7. sklearn实现 ...

  7. 题解 洛谷 P4112 【[HEOI2015]最短不公共子串】

    给定两个字符串\(A\)和\(B\),我们需要找出一个串,其在\(A\)中出现且不在\(B\)中出现,这个串为子串或者子序列,求在每种情况下,该串的最短长度. 考虑到后缀自动机可以识别一个字符串的所有 ...

  8. vb教程图文并茂

    https://blog.csdn.net/baimafujinji/article/details/70198953

  9. Spring Date JPA实现增删改查

    1.新建一个Cart类 package com.entity; public class Cart { private int id; private int userId; private int ...

  10. Java Web(5)-Servlet详解(下)

    一.HttpServletRequest 类 1. HttpServletRequest 类作用? 每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解 ...