当前位置: 首页 > news >正文

6207. 统计定界子数组的数目(每日一难phase3-2)

6207. 统计定界子数组的数目 显示英文描述

给你一个整数数组 nums 和两个整数 minK 以及 maxK 。

nums 的定界子数组是满足下述条件的一个子数组:

  • 子数组中的 最小值 等于 minK 。
  • 子数组中的 最大值 等于 maxK 。
  • 返回定界子数组的数目。

子数组是数组中的一个连续部分。

示例 1:

输入:nums = [1,3,5,2,7,5], minK = 1, maxK = 5
输出:2
解释:定界子数组是 [1,3,5] 和 [1,3,5,2] 。

示例 2:

输入:nums = [1,1,1,1], minK = 1, maxK = 1
输出:10
解释:nums 的每个子数组都是一个定界子数组。共有 10 个子数组。

提示:

2 <= nums.length <= 1e5
1 <= nums[i], minK, maxK <= 1e6

解析:

  • 看到连续子序列往往会想到滑动窗口

  • 可以想象一下,如果一个数 nums[i] < minK || nums[i] > maxK, 那么所有的区间都不会包含这个数,这个数就成了一个屏障,将左右两端的数分开;

  • 例如: nums = [1,3,5,2,7,5,1,2,3], minK = 1, maxK = 5 ;7这个元素就将左右两侧分开,我们只需要求解两侧对应区间数之和即可;

  • 如果一个区间包含minK,maxK 且所有数满足minK,maxK范围时,我们才会计算区间,区间长度如何计算呢?(下图为以cur为结尾的区间长度)
    在这里插入图片描述

  • flag初始值为-1,如果遇到屏障,将flag更新为 cur ,l = -1,r = -1(表示最大值还没遇到)

  • 将以每个元素结尾区间数相加就是所有区间数;

代码:

class Solution {
public:
    // 滑动窗口
    long long countSubarrays(vector<int>& nums, int minK, int maxK) {
        // 记录最大,最小位置
        int l=-1,r=-1,flag=-1;
        int n=nums.size();
        long long res=0;
        for(int i=0;i<n;i++){
            // 当前数加入,更新最大值最小值
            // 相当于滑动窗口,窗口右移
            if(nums[i]>=maxK){
                r=i;
            }
            if(nums[i]<=minK){
                l=i;
            }
            // 越界
            if((r!=-1&&nums[r]>maxK)||(l!=-1&&nums[l]<minK)){
                l=-1;
                r=-1;
                flag=i;
            // 如果最大值最小值没有全部遇到
            }else if(l==-1||r==-1){
                continue;
            }
            // 当前数符合,计算区间大小
            else if(nums[l]==minK&&nums[r]==maxK){
                res+=min(l,r)-flag;
            }
        }
        return res;
    }
};

一周简单的周赛,记录第一次AK😊
在这里插入图片描述

相关文章:

  • java毕业设计家居体验平台的设计与实现Mybatis+系统+数据库+调试部署
  • SpringBoot测试配置属性与启动web环境
  • 11. SpringCloud Alibaba Seata
  • C++模板之——类模板详解及代码示例
  • Python推荐系统和深度学习教程
  • 基于Matlab使用雷达资源管理有效跟踪多个机动目标仿真(附源码)
  • 医院管理系统/医院药品管理系统
  • 项目中使用到的Spring注解及其作用
  • Postgresql源码(86)varchar的创建与插入分析
  • VMware创建虚拟机及安装Linux操作系统
  • 基于51单片机的指纹考勤机密码锁系统
  • 科研小白上路的必备工具链
  • HTML5七夕情人节表白代码 (动态3D相册) HTML+CSS+JS
  • 【云原生 | 从零开始学istio】一、Istio介绍—服务网格
  • 花咲の姫君(異時層ツキハ) / 花咲(异时层妖刀)
  • AHK 中 = 和 == 等比较运算符的用法
  • Angular 2 DI - IoC DI - 1
  • mongo索引构建
  • Octave 入门
  • rabbitmq延迟消息示例
  • Swift 中的尾递归和蹦床
  • 给Prometheus造假数据的方法
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序button引导用户授权
  • 用quicker-worker.js轻松跑一个大数据遍历
  • - 转 Ext2.0 form使用实例
  • 最近的计划
  • 回归生活:清理微信公众号
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #Linux(帮助手册)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)(1.11) SiK Radio v2(一)
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (四)Linux Shell编程——输入输出重定向
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ****Linux下Mysql的安装和配置
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net framework profiles /.net framework 配置
  • .net 按比例显示图片的缩略图
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET开发者必备的11款免费工具
  • @RequestMapping 的作用是什么?
  • @SuppressWarnings(unchecked)代码的作用
  • [Angular 基础] - 数据绑定(databinding)
  • [BSGS算法]纯水斐波那契数列
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [codeforces]Checkpoints
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.