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

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

时间:2023-03-16 20:55:12浏览次数:31  
标签:力扣 2488 nums int res 中位数 --- map 数组

给你一个长度为 n 的数组 nums ,该数组由从 1 到 n 的 不同 整数组成。另给你一个正整数 k 。
统计并返回 nums 中的 中位数 等于 k 的非空子数组的数目。
注意:
    数组的中位数是按 递增 顺序排列后位于 中间 的那个元素,如果数组长度为偶数,则中位数是位于中间靠 左 的那个元素。
        例如,[2,3,1,4] 的中位数是 2 ,[8,4,3,5,1] 的中位数是 4 。
    子数组是数组中的一个连续部分。

示例 1:
输入:nums = [3,2,1,4,5], k = 4
输出:3
解释:中位数等于 4 的子数组有:[4]、[4,5] 和 [1,4,5] 。

示例 2:
输入:nums = [2,3,1], k = 3
输出:1
解释:[3] 是唯一一个中位数等于 3 的子数组。

提示:
    n == nums.length
    1 <= n <= 105
    1 <= nums[i], k <= n
    nums 中的整数互不相同
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-subarrays-with-median-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

摸打爬滚,在idea里面各种debug,终于是做出来了。

由于中位数的特点,只需要判断一个数是大于k还是小于k即可,很容易就可以联想到前缀和来做。

以k为中位数的数组,从k的位置来看,有三种:

1. k在该数组的最左边。

2. k在该数组的最右边。

3. k在该数组的中间。

而判断该数组是否以k为中位数,可以将大于k的数设为1,小于k的数设为-1,等于k的数设为0,数组中的元素和相加等于0或1时,该数组即是符合题目要求的以k为中位数的数组。

class Solution {
    public int countSubarrays(int[] nums, int k) {
//        寻找对应的下标
        int index = 0;
        for (int i = 0; i < nums.length; i ++) {
            if (nums[i] == k) {
                index = i;
                break;
            }
        }
//        它自身也算一个。
        int res = 1;
        Map<Integer, Integer> map = new HashMap<>();
//        前缀和,计算某个位置到k所在位置的值,大于k的+1,小于k的-1.等于k的=0
        nums[index] = 0;
//        从k所在位置向左遍历,将k作为数组的最右点,值为1或0的即是中位数为k的数组。
        for (int i = index - 1; i >= 0; i --) {
            nums[i] = nums[i + 1] + (nums[i] > k ? 1 : -1);
            if (nums[i] == 0 || nums[i] == 1) {
                res ++;
            }
//            记录到k指定前缀和的数量
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }
//        从k向右遍历。
        for (int i = index + 1; i < nums.length; i ++) {
            nums[i] = nums[i - 1] + (nums[i] > k ? 1 : -1);
//            以k为数组左边界的情况,和以k为右边界的相同。
            if (nums[i] == 0 || nums[i] == 1) {
                res ++;
            }
//            k在答案数组中间的情况,两边的前缀和差值为0或1时,即是以k为中位数的数组。
            if (map.containsKey(-nums[i])) {
                res += map.get(-nums[i]);
            }
            if (map.containsKey(1 - nums[i])) {
                res += map.get(1- nums[i]);
            }
        }
        return res;
    }
}

 

标签:力扣,2488,nums,int,res,中位数,---,map,数组
From: https://www.cnblogs.com/allWu/p/17224101.html

相关文章

  • Vue.js 列表渲染-列表排序
    视频<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>列表排序</title> <scripttype="text/javascript"src="../js/vue.js"></script> </head>......
  • L2-001 紧急救援
    #include<iostream>#include<cstring>#include<algorithm>#include<vector>usingnamespacestd;intg[510][510];intnum[510];intdist[510];intst[510];//st......
  • selenium-详细解读8种元素定位方式
    访问百度的小Demo可以看到,流水账式写Web自动化测试代码的顺序就是:加载驱动-访问链接-页面操作-关闭浏览器演示动图:方式一:通过元素的id-By.ID    在前......
  • High-Resolution Image Synthesis with Latent Diffusion Models
    目录概大概流程代码RombachR.,BlattmannA.,LorenzD.,EsserP.andOmmerB.High-resolutionimagesynthesiswithlatentdiffusionmodels.InIEEEComputerV......
  • day05-Lombok、SpringInitializer
    Lombok、Spring-Initializer1.Lombok1.1Lombok介绍Lombok的作用是:简化Javabean的开发,可以使用Lombok的注解让代码更加简洁Java项目中,很多没有技术含量又必须存在的......
  • csp202209-2
    题目:计算机软件能力认证考试系统01背包问题#include<bits/stdc++.h>usingnamespacestd;inta[35];intdp[300005];intmain(){intn,x;cin>>n>>x;......
  • go微服务开发:go-zero链路追踪
    在之前的go-zero教程里,我们介绍了使用演示工程开发user模块和search模块,为了更直观的呈现请求的生命周期,我们引入:链路追踪,这里我们使用的链路追踪工具是jaeger,如果你想了解......
  • Spring Study-lesson08 使用注解开发-03-16
    第一:使用注解开发必须导入AOP的包加载依赖了。spring-webmvc第二:在使用注解需要导入context约束,增加注解的支持 在beans.xml文件中第三:@component //@component组......
  • 06.深度学习--分类模型
    分类模型输入对象x,输出是这个对象属于哪一个类class,这样的应用同样有很多,比如:在金融上可以通过分类模型来决定是否贷款给某人;图像识别方面;人脸辨识方面,等等。这里依然使......
  • centos7 安装 postgresql-9.2
    1.添加yum配置yuminstall-yhttp://download.postgresql.org/pub/repos/yum/9.2/redhat/rhel-7-x86_64/pgdg-centos92-9.2-3.noarch.rpm2.安装服务yumins......