5939. 半径为 k 的子数组平均值

给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。

半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i - k 和 i + k 范围(含 i - k 和 i + k)内所有元素的平均值。如果在下标 i 前或后不足 k 个元素,那么 半径为 k 的子数组平均值 是 -1 。

构建并返回一个长度为 n 的数组 avgs ,其中 avgs[i] 是以下标 i 为中心的子数组的 半径为 k 的子数组平均值 。

x 个元素的 平均值 是 x 个元素相加之和除以 x ,此时使用截断式 整数除法 ,即需要去掉结果的小数部分。

例如,四个元素 2、3、1 和 5 的平均值是 (2 + 3 + 1 + 5) / 4 = 11 / 4 = 3.75,截断后得到 3 。

示例 1:输入:nums = [7,4,3,9,1,8,5,2,6], k = 3
输出:[-1,-1,-1,5,4,4,-1,-1,-1]
解释:
- avg[0]、avg[1] 和 avg[2] 是 -1 ,因为在这几个下标前的元素数量都不足 k 个。
- 中心为下标 3 且半径为 3 的子数组的元素总和是:7 + 4 + 3 + 9 + 1 + 8 + 5 = 37 。使用截断式 整数除法,avg[3] = 37 / 7 = 5 。
- 中心为下标 4 的子数组,avg[4] = (4 + 3 + 9 + 1 + 8 + 5 + 2) / 7 = 4 。
- 中心为下标 5 的子数组,avg[5] = (3 + 9 + 1 + 8 + 5 + 2 + 6) / 7 = 4 。
- avg[6]、avg[7] 和 avg[8] 是 -1 ,因为在这几个下标后的元素数量都不足 k 个。示例 2:输入:nums = [100000], k = 0
输出:[100000]
解释:
- 中心为下标 0 且半径 0 的子数组的元素总和是:100000 。avg[0] = 100000 / 1 = 100000 。示例 3:输入:nums = [8], k = 100000
输出:[-1]
解释:
- avg[0] 是 -1 ,因为在下标 0 前后的元素数量均不足 k 。

提示:

  • n == nums.length
  • 1 <= n <= 10510^5105
  • 0 <= nums[i], k <= 10510^5105

解题思路

使用前缀和,可以快速计算出下标在 i - k 和 i + k 范围(含 i - k 和 i + k)内所有元素的总和,计算公式为:pre[i+k]-pre[i-k-1],如果在下标 i 前或后不足 k 个元素,则直接跳过该半径为 k 的子数组平均值 的计算。

代码

class Solution {public:vector<int> getAverages(vector<int> &nums, int k) {int n = nums.size(),cnt=2*k+1;vector<long long > pre(n);vector<int> res(n,-1);pre[0]=nums[0];for (int i = 1; i < n; i++) {pre[i]=pre[i-1]+nums[i];}if (2*k<n)res[k]=pre[2*k]/cnt;for (int i = k+1; i+k < n; ++i) {res[i]=(pre[i+k]-pre[i-k-1])/cnt;}return res;}
};

5939. 半径为 k 的子数组平均值相关推荐

  1. LeetCode 2090. 半径为 k 的子数组平均值(滑窗)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k . 半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 ...

  2. 力扣 2090. 半径为 k 的子数组平均值

    题目 给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k . 半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有 ...

  3. [Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]

    [问题描述][第560题][和为K的子数组][中等] 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数.示例 1 :输入:nums = [1,1,1], k = 2 输 ...

  4. 【枚举 + 求最大公约数方法】最大公约数等于K的子数组数目问题

    慢一点是为了快一点,加油,大家 ,不要放弃 ! -- 2022/11/13 一.题目描述: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 nums 的子数组中元素的最大公因数等于 k ...

  5. 2022-6-13 咒语和药水的成功对数,替换字符后匹配,统计得分小于 K 的子数组数目,......

    1. 咒语和药水的成功对数 You are given two positive integer arrays spells and potions, of length n and m respec ...

  6. 最大公因数等于 K 的子数组数目求解全过程

    题目:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 nums 的子数组中元素的最大公因数等于 k 的子数组数目. 子数组 是数组中一个连续的非空序列. 数组的最大公因数(Greates ...

  7. 和为k的子数组、中位数为k的子数组

    和为 K 的子数组 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 . 示例 1: 输入:nums = [1,1,1], k = 2 输出:2 示例 ...

  8. 11. Leetcode 713. 乘积小于K的子数组 (数组-同向双指针-滑动窗口)

    给定一个正整数数组 nums和整数 k .请找出该数组内乘积小于 k 的连续的子数组的个数.示例 1:输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小于10 ...

  9. leetcode713. 乘积小于K的子数组(双指针)

    给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小于100的子数 ...

最新文章

  1. 设置WebStorm查看本地源码文件个人修改的历史记录快捷键Alt+Shift+H、Ctrl+Shift+H(通常用于调试bug,发现文件出问题需要回溯到若干天之前)
  2. lucene索引合并与增量索引
  3. “非自回归”也不差:基于MLM的阅读理解问答
  4. JavaScript 数组和对象
  5. python 面向对象_多态、内置方法、反射
  6. 2022年,图机器学习Graph ML发展到哪了?
  7. Idea中maven项目中导入本地jar包
  8. pytorch 实现RBF网络
  9. 矩阵分析 (五) 矩阵的分解
  10. matlab 2017a下载以及安装教程 亲测有效
  11. mysql 求和_mysql分组求和
  12. SQL Server 2012 下载与安装详细教程
  13. 【企业开源】小米开源:站在巨人肩膀上的创新
  14. Python修改屏幕分辨率
  15. package.json 文件详解
  16. BZOJ 2429: [HAOI2006]聪明的猴子|最小生成树kruskal
  17. oracle utl file putf,UTL_FILE包详解(第二篇)
  18. 计算机公共基础知识总结,计算机公共基础知识总结.docx
  19. 【zz】dpdk全面分析
  20. 国家开放大学计算机绘图边学边练答案,国家开放大学人文英语四1-8单元边学边练答案Microsoft Word 文档...

热门文章

  1. 循环服务器,并发服务器模型以及I/O多路转接模型
  2. select函数(一)
  3. 我了解到的面试的一些小内幕!顺利通过阿里Android岗面试
  4. PHPCMS的产品筛选功能
  5. spring boot构建
  6. MMU内存管理单元(看书笔记)
  7. phpstrom+phpstudy+postman
  8. hightmaps 按地图上显示的统计数据
  9. 序列化与反序列化(记住密码)
  10. oracle数据库用脚本运行SQL语句