LeetCode 滑动窗口 滑动子数组的美丽值

ops/2024/9/22 20:21:06/

滑动子数组的美丽值

给你一个长度为 n 的整数数组 nums ,请你求出每个长度为 k 的子数组的 美丽值 。
一个子数组的 美丽值 定义为:如果子数组中第 x 小整数 是 负数 ,那么美丽值为第 x 小的数,否则美丽值为 0 。
请你返回一个包含 n - k + 1 个整数的数组,依次 表示数组中从第一个下标开始,每个长度为 k 的子数组的 美丽值 。
子数组指的是数组中一段连续 非空 的元素序列。
示例 1:
输入:nums = [1,-1,-3,-2,3], k = 3, x = 2
输出:[-1,-2,-2]
解释:总共有 3 个 k = 3 的子数组。
第一个子数组是 [1, -1, -3] ,第二小的数是负数 -1 。
第二个子数组是 [-1, -3, -2] ,第二小的数是负数 -2 。
第三个子数组是 [-3, -2, 3] ,第二小的数是负数 -2 。
示例 2:
输入:nums = [-1,-2,-3,-4,-5], k = 2, x = 2
输出:[-1,-2,-3,-4]
解释:总共有 4 个 k = 2 的子数组。
[-1, -2] 中第二小的数是负数 -1 。
[-2, -3] 中第二小的数是负数 -2 。
[-3, -4] 中第二小的数是负数 -3 。
[-4, -5] 中第二小的数是负数 -4 。
示例 3:
输入:nums = [-3,1,2,-3,0,-3], k = 2, x = 1
输出:[-3,0,-3,-3,-3]
解释:总共有 5 个 k = 2 的子数组。
[-3, 1] 中最小的数是负数 -3 。
[1, 2] 中最小的数不是负数,所以美丽值为 0 。
[2, -3] 中最小的数是负数 -3 。
[-3, 0] 中最小的数是负数 -3 。
[0, -3] 中最小的数是负数 -3 。
提示:
n == nums.length
1 <= n <= 105
1 <= k <= n
1 <= x <= k
-50 <= nums[i] <= 50

解题思路

  • 滑动数组 + 暴力枚举

题目是要求计算定长子数组的美丽值,所以采用定长滑动窗口进行枚举

接下来是计算美丽值,也就是找到子数组的第X小的数

由于-50 <= nums[i] <= 50 也就是数组的值范围比较小,所以可以采用一个数组 arr 记录各个数字出现的次数,然后遍历这个数组,找到第X小的数,暴力枚举出美丽值

关于如何找到第X小的数:我们用数组记录各个数字出现的次数时,由于数组的小标大于等于0,所以我们要对数字+50,那么数组的下标-50就是对应的数字。因为第X小的数若是非负数,美丽值则为0,所以只需要计算负数的出现次数,暴力枚举只需要枚举到数组的49下标。在暴力枚举中,我们统计出现的数字的个数 sum,也就是对 arr 的数据进行累加,当 sum 首次大于等于 x 时,此时的下标-50就是第X小的数,也就是美丽值,然后退出循环。若循环正常结束,则美丽值为0。

代码如下↓

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* getSubarrayBeauty(int* nums, int numsSize, int k, int x, int* returnSize){int compare(int* a,int* b){return *a - *b;}int f=-1;int* res = (int*)malloc(sizeof(int)*(numsSize-k+1));int arr[101];memset(arr,0,sizeof(arr));int l=0,r=k-1;*returnSize = numsSize-k+1;for(int i=0;i<k;i++){arr[nums[i]+50]++;}int sum=0;int ff=1;for(int i=0;i<50;i++){sum+=arr[i];if(sum>=x){res[++f] = i-50;ff=0;break;}}if(ff){res[++f] = 0;}while(r<numsSize-1){arr[nums[l]+50]--;l++;r++;arr[nums[r]+50]++;sum=0;ff=1;for(int i=0;i<50;i++){sum+=arr[i];if(sum>=x){res[++f] = i-50;ff=0;break;}}if(ff){res[++f] = 0;}}return res;
}

http://www.ppmy.cn/ops/114405.html

相关文章

Python 二级考试

易错点 电脑基础知识 定义学生关系模式如下&#xff1a;Student &#xff08;S#&#xff0c; Sn&#xff0c; Ssex&#xff0c;class&#xff0c;monitorS#&#xff09;&#xff08;其属性分别为学号、学生名、性别、班级和班长学号&#xff09; 在关系模式中&#xff0c;如果…

Vue3中shallowRef和ref区别

在 Vue 3 中&#xff0c;ref 和 shallowRef 都是用来创建响应式引用的工具&#xff0c;但它们之间存在一些关键的区别&#xff0c;主要在于它们如何处理对象的响应式特性。 ref ref 创建的是一个完整的响应式引用&#xff0c;它不仅使基础值成为响应式的&#xff0c;而且当值…

大学生涯规划

记得大学刚开学老师布置的作业就是写自己的职业生涯规划&#xff0c;但是直到大学毕业我也不知道有什么规划&#xff0c;很迷茫&#xff0c;虽然经常去图书馆看书&#xff0c;前端、后端、C#、JAVA等东一棍西一棒&#xff0c;但是实际上实战经验很少&#xff0c;知识基本也没运…

食品检测与分类系统源码分享

食品检测与分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

在Python中快速获取HTML中<span>标签的内容

在Python中&#xff0c;要获取HTML中<span>标签的内容&#xff0c;通常我们会使用像BeautifulSoup这样的库&#xff0c;它提供了方便的方法来解析HTML和XML文件&#xff0c;并从中提取数据。下面是一个使用BeautifulSoup来获取<span>标签内容的简单示例。 首先&am…

前后端分离,使用MOCK进行数据模拟开发,让前端攻城师独立于后端进行开发

mock是什么 Mock生成随机数据,拦截Ajax 请求&#xff0c;前后端分离&#xff0c;让前端攻城师独立于后端进行开发。 增加单元测试的真实性 通过随机数据,模拟各种场景。 在实际开发过程中&#xff0c;前端是通过axios来请求数据的&#xff0c;很多时候前端开发者就是通过写固定…

茴香豆的茴的写法-SpringBoot处理客户端请求的几种方式

方式1&#xff1a;Controller或者RestController /*** 方式1&#xff1a;Controller* */ RestController public class AtController {GetMapping("/at")public String at() {return "Controller";} }方式2&#xff1a;Component Controller接口 /*** 方…

【devops】devops-ansible之介绍和基础使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…