题目

给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。

示例:

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

输出:12.75

解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

提示:

  1. 1 <= k <= n <= 30,000
  2. 所给数据范围 [-10,00010,000]。

来源:力扣(LeetCode)

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

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

分析

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

  1. double findMaxAverage(int* nums, int numsSize, int k){
  2. }

这里可以得出信息:

nums就是整个数组的名字

numsSize就是数组长度大小

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

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

  1. double findMaxAverage(int* nums, int numsSize, int k)
  2. {
  3. double maxTotal=-300000000,total=0,maxAverage=0;
  4. for (int j=0;j<=numsSize-k;j++)
  5. {
  6. for(int i=0;i<k;i++)
  7. {
  8. total+=nums[j+i];
  9. }
  10. if(maxTotal<total)maxTotal=total;
  11. total=0;
  12. }
  13. maxAverage=maxTotal/k;
  14. return maxAverage;
  15. }

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

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

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

力扣官方也给了图示:

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

  1. double findMaxAverage(int* nums, int numsSize, int k) {
  2. int sum = 0;
  3. for (int i = 0; i < k; i++) {
  4. sum += nums[i];
  5. }
  6. int maxSum = sum;
  7. for (int i = k; i < numsSize; i++) {
  8. sum = sum - nums[i - k] + nums[i];
  9. if(maxSum<sum)maxSum=sum;
  10. }
  11. return (double)(maxSum) / k;
  12. }

优化之后的效果如下

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

力扣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. maven 无法导入ojdbc 的jar包 解决方法

    由于maven无法在线安装ojdbc包,所有先在我们需要手动导入. 准备环境: 1.系统需要配置好jdk以及maven环境. 2.ojdbc的jar包,记住jar的路径,我的路径是:E:\jdbc\o ...

  2. 【JDBC核心】数据库事务

    数据库事务 概述 事务是逻辑上的一组操作,或者说一个独立的工作单元.事务内的语句,要么全部执行成功,要么全部执行失败. 事务处理 数据一旦提交,就不可回滚.数据意味着提交的情况: 当一个连接对象被创建 ...

  3. 剑指offer 面试题10:斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 编程思想 知道斐波拉契数列的规律即可. 编程实现 class Solu ...

  4. Azure 存储简介

    Azure Storage Account(存储账户)包含所有Azure Storage的数据对象,包括Blob.Data Lake Gen2,File.Queue.Disk和Table等服务,该St ...

  5. Python绘制雷达图(俗称六芒星)

    原文链接:https://blog.csdn.net/Just_youHG/article/details/83904618 背景 <Python数据分析与挖掘实战> 案例2–航空公司客户 ...

  6. LeetCode637. 二叉树的层平均值

    题目 1 class Solution { 2 public: 3 vector<double>ans; 4 vector<double> averageOfLevels(Tr ...

  7. 基础练习(上) - 蓝桥杯(Python实现)

    闰年判断: 题目: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍数 ...

  8. bash shell数组使用总结

    本文为原创博文,转发请注明原创链接:https://www.cnblogs.com/dingbj/p/10090583.html  数组的概念就不多说了,大家都懂! shell数组分为索引数组和关联数 ...

  9. 08--Docker安装Mysql

    1.在hub.docker.com中查找5.7版本 2.拉取mysql docker pull mysql:5.7 3.启动mysql镜像 docker run -p 3306:3306 --name ...

  10. 2021年官网下载各个版本JDK最全版与官网查阅方法

    版本说明 1.安装部署JDK (1)环境 (2)官网下载JDK 由于官网的地址会随着时间的修改而更改修改下载地址,现在讲述下通用的界面操作下载JDK,以后JDK收费更严重,估计就只能下载开源的了. A ...