代码编织梦想

统计中位数为 K 的子数组【LC2488】

给你一个长度为 n 的数组 nums ,该数组由从 1n不同 整数组成。另给你一个正整数 k

统计并返回 nums 中的 中位数 等于 k 的非空子数组的数目。

注意:

  • 数组的中位数是按递增顺序排列后位于 中间 的那个元素,如果数组长度为偶数,则中位数是位于中间靠 左 的那个元素。
    • 例如,[2,3,1,4] 的中位数是 2[8,4,3,5,1] 的中位数是 4
  • 子数组是数组中的一个连续部分。

自己做的时候也是转换成了+1-1 ,但是是大于等于的+1,小于的-1,然后如果是中位数那么差为1,但是一部分案例不对,不愿细想了,时间就是个无底洞。

  • 思路:

    将子数组根据长度分为两种情况

    • 长度为奇数时,「k 是长为奇数的子数组的中位数」等价于「子数组中小于k 的数的个数 === 大于 k 的数的个数」

      • 这相当于「左侧小于 +右侧小于 = 左侧大于 + 右侧大于」。

        变形得到「左侧小于 − 左侧大于 = 右侧大于 −右侧小于」。

    • 长度为偶数时,「k 是长为奇数的子数组的中位数」等价于「子数组中小于k 的数的个数 === 大于 k 的数的个数」

      • 这相当于「左侧小于 +右侧小于 = 左侧大于 + 右侧大于 - 1」。

        变形得到「左侧小于 − 左侧大于 = 右侧大于 −右侧小于 -1」。

    • 为了方便计算,把这四类数字等价转换,然后记录在数组cnt中:

      • 左侧小于:在 k左侧且比 k 小的视作 1;
      • 左侧大于:在 k 左侧且比 k 大的视作 −1;
      • 右侧大于:在 k 右侧且比 k 大的视作 1;
      • 右侧小于:在 k 右侧且比 k 小的视作 −1。
    • 那么可以将目标值左侧的小于-左侧大于的值,放入数组cnt中,然后枚举右侧的端点 r r r(包括自身),以 r r r为右端点的奇数数组的数目为cnt[x],偶数数组的数目为cnt[x-1]

  • 实现

    class Solution {
        public int countSubarrays(int[] nums, int k) {
            int n = nums.length;
            int i = 0;
            for (; nums[i] != k; ++i) {}
            int[] cnt = new int[n << 1 | 1];
            int ans = 1;
            int x = 0;
            for (int j = i + 1; j < n; ++j) {
                x += nums[j] > k ? 1 : -1;
                if (x >= 0 && x <= 1) {
                    ++ans;
                }
                ++cnt[x + n];
            }
            x = 0;
            for (int j = i - 1; j >= 0; --j) {
                x += nums[j] > k ? 1 : -1;
                if (x >= 0 && x <= 1) {
                    ++ans;
                }
                ans += cnt[-x + n] + cnt[-x + 1 + n];
            }
            return ans;
        }
    }
    
    作者:ylb
    链接:https://leetcode.cn/problems/count-subarrays-with-median-k/solutions/2171706/python3javacgotypescript-yi-ti-yi-jie-bi-whsm/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度

      • 时间复杂度: O ( n ) O(n) O(n)

      • 空间复杂度: O ( n ) O(n) O(n)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Tikitian/article/details/129602942

zjoi2017 day1_fuse123fuse的博客-爱代码爱编程

T1 仙人掌 题目 题目描述 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌。所谓简单环即不经过重复的结点的环。 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得这张图中的

我的lc笔记-爱代码爱编程

LC打卡计划 D1D4 173,116D5 110,220D6 622,200,752279dpgreedygreedy+bfs递减栈优化技巧494不会dp,开始学dp链表插入排序的使用条件:归并排序54118String67137 我是真的不会了,太厉害了still 不懂取mod后,能防止溢出,但是不也改变原先值了吗557快慢指针28392203

python workspace_python中常用的模块一-爱代码爱编程

一,常用的模块 模块就是我们将装有特定功能的代码进行归类,从代码编写的单位来看我们的程序,从小到大的顺序: 一条代码 引入模块的方式 1,import 模块 2,from xxx import 模块 二,collections模块 collections 模块主要封装了一些关于集合类的相关操作,比如我们学过的iterable,iterat

c语言中10L的类型为,C语言中数据类型-爱代码爱编程

一、基本数据类型 1. 基本数据类型的分类: C语言中的三种基本数据类型是:整型 、实型 、字符型 。每种类型又可以分为常量和变量。 整型常量: (1) 十进制的整型常量:由数字0~9组成。如:0、10、365、-12等。 (2) 八进制的整型常量:以0开头,由数字0~7组成。如:0、010、0365、-012、011等。 (3) 十六

第十二届蓝桥杯 2021年国赛真题 (Java 大学B组)-爱代码爱编程

蓝桥杯 2021年国赛真题(Java 大学 B 组 ) #A 整数范围#B 纯质数预备知识朴素解法按位枚举#C 完全日期Java党的完全胜利朴素解法朴素改进不依赖 API 的实现#D 最小权值记忆化搜索动态规划#E 大写#F 123前缀和#G 和与乘积优雅骗分试着推一下不推了,摆烂了#H 巧克力贪心算法并查集优化贪心 + 大根堆#I 翻转括号序列线

最新八股文面试题-爱代码爱编程

# **Java面向对象有哪些特征,如何应用** ​        面向对象编程是利用类和对象编程的一种思想。万物可归类,类是对于世界事物的高度抽象 ,不同的事物之间有不同的关系 ,一个类自身与外界的封装关系,一个父类和子类的继承关系, 一个类和多个类的多态关系。万物皆对象,对象是具体的世界事物,面向对象的三大特征封装,继承,多态。封装,封装说明一个类行

2022.10.26 leetcode每日一题 862.和至少为 k 的最短子数组_heartraindj的博客-爱代码爱编程

862.和至少为 K 的最短子数组 给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k 的 最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1 。 子数组 是数组中

【每日一题day37】lc795区间子数组的个数 | 单调栈 模拟_tikitianya的博客-爱代码爱编程

区间子数组的个数【LC795】 给你一个整数数组 nums 和两个整数:left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个

【每日一题day78】lc1803统计异或值在范围内的数对有多少 | 字典树+容斥原理-爱代码爱编程

字典树 CPU爆炸 理论基础 Trie 树(又叫「前缀树」或「字典树」)是一种用于快速查询「某个字符串/字符前缀」是否存在的数据结构。 其核心是使用「边」来代表有无字符,使用「点」来记录是否为「单词结尾」以及「其后

leetcode:406按照身高和体重排序:-爱代码爱编程

406. 根据身高重建队列 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 que

【艾琪出品】-爱代码爱编程

自用留存 1. 若变量c为char类型,能正确判断出c为小写字母的表达式是() ’a’&lt;=c&lt;=’z’|(c&gt;=’a’) || (c&lt;=’z’)|(‘a’&lt;=c) and (‘z’&gt;=c)|(c&gt;=’a’) && (c&lt;

lc——周赛记录_lc周赛-爱代码爱编程

目录 84场——双周赛(模拟) 6142. 统计坏数对的数目(模拟)6174. 任务调度器 II(贪心,数学)6144. 将数组排序的最少替换次数 305场——单周赛(dp) 6137. 检查数组是否存在

java面试题大全(总结)_java面试汇总-爱代码爱编程

Java常见面试题大全 **Java面向对象有哪些特征,如何应用**HashMap原理是什么,在jdk1.7和1.8中有什么区别ArrayList和LinkedList有什么区别高并发中的集合有哪些问题jdk1