首页 > 其他分享 >2488. 统计中位数为 K 的子数组

2488. 统计中位数为 K 的子数组

时间:2023-04-08 23:36:11浏览次数:45  
标签:2488 nums int 中位数 Num 数组 区间

题目链接:2488. 统计中位数为 K 的子数组

方法:前缀和 + 哈希

解题思路

  1. 根据题意可知,在\(k\)是中位数的子数组中,比\(k\)大的数 \(-\) 比\(k\)小的数 \(=\) \(0\) || \(1\)。那么将两种状态,小于\(k\)置\(-1\),大于\(k\)置\(+1\),计算数组的前缀和\(s\)。
  2. 由于子数组要包含\(k\),所有左右端点一定在\(k\)值的两边(包括\(k\)),即子数组可以分为两部分\([l, r]\) 和 \([r + 1, i]\),\(i < n\);当两部分的区间和为\(0\) || \(1\)时,即大于\(k\)的值比小于\(k\)的值多\(1\)或相等,此时子数组符合条件。
  3. 现在我们通过\(hash\)统计右区间\([r + 1, i]\)的区间值的数量(\(hash\)[区间值] = 数量),然后再枚举左边区间,找合适的右区间的数量即可。

代码

class Solution {
public:
    int countSubarrays(vector<int>& nums, int k) {
        int l = find(nums.begin(), nums.end(), k) - nums.begin() + 1; //初始化子数组的左右端点为数值k的下标 + 1
        int r = l, n = nums.size(), ans = 0;
        vector<int> s(n + 1);
        unordered_map<int, int> Num;
        while (r <= n) { // 从左往右, 统计右边区间值
            if (nums[r - 1] < k) s[r] = s[r - 1] - 1;
            else if(nums[r - 1] > k) s[r] = s[r - 1] + 1;
            else s[r] = 0;
            Num[s[r]] ++ , r ++;
        }
        while (l >= 1) { // 从右往左, 枚举左边区间
            if (nums[l - 1] < k) s[l] = s[l + 1] - 1;
            else if(nums[l - 1] > k) s[l] = s[l + 1] + 1;
            else s[l] = 0;
            ans += Num[-s[l]] + Num[1 - s[l]];
            l -- ;
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n)\);
空间复杂度:\(O(n)\);

标签:2488,nums,int,中位数,Num,数组,区间
From: https://www.cnblogs.com/lxycoding/p/17299568.html

相关文章

  • 108. 将有序数组转换为二叉搜索树
    题目链接:108.将有序数组转换为二叉搜索树方法:递归建树解题思路每次选取中间的元素作为根节点,递归创建左右子树,就可以保证左右子树的高度差绝对值不超过1代码/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*......
  • 1590. 使数组和能被 P 整除
    题目链接:1590.使数组和能被P整除方法:前缀和+哈希解题思路(1)要求\((sum-sunSum)\)%\(p=0\),即要求\([sum-(s[j]-s[i])]\)%\(p=0\),即\(sum\)%\(p=(s[j]-s[i])\)%\(p\),即\(s[j]\)%\(p-sum\)%\(p=s[i]\)%\(p\);(2)上述中的\(sum\)可以提前确......
  • 二维数组
    在刷力扣题目是会遇到这种情况int**generate(intnumRows,int*returnSize,int**returnColumnSizes){}intnumRows:表示这传入的是一个数。int*returnSize:表示这传入的是一个数的地址。int**returnColumnSizes:表示这传入的是一个数组的地址。为什么要这么做呢?答:在......
  • 1144. 递减元素使数组呈锯齿状
    题目链接:1144.递减元素使数组呈锯齿状方法:找规律+模拟解题思路对于一个整数数组\(nums\),可以转换为题目中两种锯齿数组,对于两种情况的转换取最小值。并且由于操作只能将一个元素减1,因此:对于第1种情况,只用下标为奇数的元素需要减小到比两边最小值小1;对于第2种情况,只用下......
  • 数组扁平化
    vararr=[{id:1,title:'我是1目录',children:[{id:11,title:'我是1-1目录',children:[{id:111,title:&#......
  • 『0016』 - Solidity Types - 玩转 Solidity 数组 (Arrays)
    作者:黎跃春,学习目标掌握Arrays的可变不可变的创建深度理解可变数组和不可变数组之间的区别二维数组memoryarrays的创建bytes0~bytes32、bytes与byte[]对比固定长度的数组(Arrays)固定长度类型数组的声明pragmasolidity^0.4.4;contractC{//数组的长度为5,数组里面的存储......
  • 『0013』 - Solidity Types - 固定大小字节数组(Fixed-size byte arrays)
    作者:黎跃春,固定大小字节数组(Fixed-sizebytearrays)固定大小字节数组可以通过bytes1,bytes2,bytes3,…,bytes32来进行声明。PS:byte的别名就是byte1。bytes1只能存储一个字节,也就是二进制8位的内容。bytes2只能存储两个字节,也就是二进制16位的内容。bytes3只能存储三个字......
  • 『0014』 - Solidity Types - 动态大小字节数组(Dynamically-sized byte array)
    作者:黎跃春,一、Dynamically-sizedbytearraystring是一个动态尺寸的UTF-8编码字符串,它其实是一个特殊的可变字节数组,string是引用类型,而非值类型。bytes动态字节数组,引用类型。根据经验,在我们不确定字节数据大小的情况下,我们可以使用string或者bytes,而如果我们清楚的知道或者......
  • 【Java】数组
    数组是编程语言中常见的数据结构,用来存储一组相同数据类型的数据,可以通过整型索引访问数组中的每一个值。需要注意,同一个数组中存储的所有元素的数据类型必须相同。根据数组存放元素的组织结构,可将数组分为一维数组、二维数组以及多维(三维及以上)。创建数组:data_type[]varName;......
  • JavaScript 数组笔记
    添加和删除数组项添加push()push()方法:向数组的末尾添加一个或多个元素,并返回修改后的数组长度。语法:arr.push(element1[,...[,elementN]])参数:element1,...,elementN:要添加到数组末尾的元素。示例:constfruits=['apple','banana','orange'];constnewLength......