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-两个排序数组 ...
 
随机推荐
- sql与SQL CODE和SQL State相关报错
			
操作数据库过程中,遇到许多问题,很多都与SQL CODE和SQL State相关,现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明,一来可以自己参考,对DB2错误自行找出原 ...
 - ajax原生js封装
			
不带注释的 function ajax(json) { json.type = json.type ? json.type : 'get'; json.async = json.async == fa ...
 - Element 季度选择器+导入
			
苦恼于element没有季度选择器,网上搜罗后整理实现,以便后期开发使用 同文件夹下新建一个vue界面,命名为Quarter.vue <template> <el-form> ...
 - django-rest-framework-源码解析002-序列化/请求模块/响应模块/异常处理模块/渲染模块/十大接口
			
简介 当我们使用django-rest-framework框架时, 项目必定是前后端分离的, 那么前后端进行数据交互时, 常见的数据类型就是xml和json(现在主流的是json), 这里就需要我们d ...
 - Python学习手册(第4版)PDF高清完整版免费下载|百度云盘
			
Python学习手册(第4版)PDF高清完整版免费下载|百度云盘 提取码:z6il 内容简介 Google和YouTube由于Python的高可适应性.易于维护以及适合于快速开发而采用它.如果你想要编 ...
 - Python编程入门(第3版)|百度网盘免费下载|零基础入门学习资料
			
百度网盘免费下载:Python编程入门(第3版) 提取码:rsd7 目录 · · · · · · 第1章 编程简介 11.1 Python语言 21.2 Python适合用于做什么 31.3 程序员 ...
 - 关于简单的数据双向绑定原理,defineProperty 和Proxy演示
			
双向绑定,也就是说js中的数据传到页面,页面中的内容到js,实现同步更新,简单的演示可以直接复制下放HTML代码运行. 在这个例子中,我们使用defineProperty ,Object.define ...
 - 关于页面布局中,如何让一个div水平和垂直居中的五个方案
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - 深入理解Spring AOP 1.0
			
本文相关代码(来自官方源码spring-test模块)请参见spring-demysify org.springframework.mylearntest包下. 统称能够实现AOP的语言为AOL,即( ...
 - 一步步教你用Prometheus搭建实时监控系统系列(二)——详细分析拉取和推送两种不同模式
			
前言 本系列着重介绍Prometheus以及如何用它和其周边的生态来搭建一套属于自己的实时监控告警平台. 本系列受众对象为初次接触Prometheus的用户,大神勿喷,偏重于操作和实战,但是重要的概念 ...