题目

给定 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]。

来源:力扣(LeetCode)

链接:子数组最大平均数I

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

力扣在编程模板里给了如下代码:

double findMaxAverage(int* nums, int numsSize, int k){

}

这里可以得出信息:

nums就是整个数组的名字

numsSize就是数组长度大小

k就是要求的子数组的大小

既然他都给出了这些基础定义,下面就按照这个思路去想就好,我也是第一次写这种题目,说实话,我第一反应就是对数组内的区间进行逐元素向后移动即可,中间用total求和,且每次区间求和与maxtotal比较,若是较大就替代,一直执行到最后,在除以k就可以得到最大的average了。

double findMaxAverage(int* nums, int numsSize, int k)
{
double maxTotal=-300000000,total=0,maxAverage=0;
for (int j=0;j<=numsSize-k;j++)
{
for(int i=0;i<k;i++)
{
total+=nums[j+i];
}
if(maxTotal<total)maxTotal=total;
total=0;
}
maxAverage=maxTotal/k;
return maxAverage;
}

这真的是很垃圾啊,一点算法都没用上的程序,自然就是超时,所以对于这里面的代码和逻辑结构进行了思索。

因为是逐个往后进行一个total用法的确就是对于k个值求和的最大来求最大平均值,但是套入两个for里面,程序复杂度就未免太高了。

这就不得不提到滑动窗口了,就是这区间长度是不变的,所以就是随着区间后移,最前面的移除,在区间后面的加入。

力扣官方也给了图示:

减去左边的加上右边的,这样就不必繁琐得对中间数据求和了。



double findMaxAverage(int* nums, int numsSize, int k) {
int sum = 0;
for (int i = 0; i < k; i++) {
sum += nums[i];
}
int maxSum = sum;
for (int i = k; i < numsSize; i++) {
sum = sum - nums[i - k] + nums[i];
if(maxSum<sum)maxSum=sum;
}
return (double)(maxSum) / k;
}

优化之后的效果如下

不得不提一句啊,这个运行速度和内存消耗真的就离谱,每次运行都不一样。我这个结果就是运行几次里面的最好看的数据(搬上来自然用最好看的数据了

力扣643.子数组最大平均数I-C语言实现的更多相关文章

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

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

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

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

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

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

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

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

  5. 力扣1423. 可获得的最大点数-C语言

    题目 题目链接 几张卡牌 排成一行,每张卡牌都有一个对应的点数.点数由整数数组 cardPoints 给出. 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌. 你的点数就是 ...

  6. 力扣485. 最大连续1的个数-C语言实现-简单题

    题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...

  7. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题

    题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...

  8. [LC]643题 Maximum Average Subarray I(子数组最大平均数 I)

    ①英文题目 Given an array consisting of n integers, find the contiguous subarray of given length k that h ...

  9. leetcode 643. Maximum Average Subarray I 子数组最大平均数 I

    一.题目大意 https://leetcode.cn/problems/maximum-average-subarray-i/ 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k . 请你 ...

随机推荐

  1. 首秀:Markdown学习笔记

    # Markdown学习 ## 标题 ### 三级标题 #### 四级标题 ## 字体 **Hello,World!** *Hello,World!* ***Hello,World!*** ~~Hel ...

  2. LAMP架构之PHP-FPM 服务器 转

    安装PHP 解决依赖关系 # 请配置好yum源(系统安装源及epel源)后执行如下命令: yum -y groupinstall "Desktop Platform Development& ...

  3. SpringgBoot父子工程的创建

    知识:SpringBoot父子工程创建 花开堪折直需折,莫待无花空折枝 开始之前,非常非常有必要了解一下关于以及的区别,这样才可以在进行创建maven父子工程种避免一些不必要的意外错误. depend ...

  4. ForwardProcess

    共享式网络中,发送的报文所有设备都可以收到 0.0.0.0/0 缺省路由 可以到达任意网络 From WizNote

  5. Python解释器和IPython

    目录 简介 Python解释器 IPython 魔法函数 运行和编辑 Debug History 运行系统命令 简介 今天给大家介绍一下Python的一个功能非常强大的解释器IPython.虽然Pyt ...

  6. 如何将未呈现的WPF控件保存到图片

    SaveFileDialog save = new SaveFileDialog(); save.Filter = "BMP|*.bmp|PNG|*.png|JPG|*.jpg"; ...

  7. PHP 获取天气

    /** * 获取天气 */ function get_tq () { //获取用户ip地址 $ip = get_real_ip(); // $ip = '123.125.71.38'; //根据ip地 ...

  8. Docker-Compose练习

    运行一个镜像,需要添加大量的参数. 可以通过Docker-Compose编写这些参数. Docker-Compose可以帮助我们批量的管理容器. 只需要通过一个docker-compose.yml文件 ...

  9. Linux基础命令整合

    linux基础命令整理 1.系统相关命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minu ...

  10. 【SpringMVC】SpringMVC 拦截器

    SpringMVC 拦截器 文章源码 拦截器的作用 SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 谈到拦截器,还有另外一个概 ...