【面试题 - 最大值减去最小值小于或等于 num 的子数组数量】滑动窗口

题干:

解题报告:

我们用两个指针(i,j)分别代表窗口的左边界和右边界,窗口也就是子数组;
用两个双端队列分别维护这个窗口的最大值和最小值;
当窗口扩大时,即j向右扩展时,窗口内的最大值只会越来越大,而最小值只会越来越小(否则就会等于原来的max和min了),此时,如果max-min>num,则j不应该向右扩展了,因为max-min的范围只会越来越大;
这时,应该让窗口缩小,即i向右扩展,这样max可能会减小,min可能会增大(因为原来的max和min可能会失效,即不在窗口内),这样max-min才会有<=num的可能;

另一个题解:

1)最简单的方法,暴力搜索,如何得到全部满足条件的子数组,
          left = 0, res=0;
          1:我们left不变 right++直到right=arr.length结束,每次right++我们都得到left~right的最大值,最小值 符合条件res++;
          2:然后left++ 重复第一步。

2)首先我们不用遍历n*n次,
          当满足条件right++  不满足时left++  这样时间复杂度为n*2;
          原因:当最大值-最小值>k时 我们right++ 如果arr[right]>最大值 或者arr[right]<最小值 差值都是增大的因此在移动right没有意义。
           left++,将子数组缩小,
           如果移除的数字是最大值,那么次大值-最小值 差值缩小;
           如果移除的数字是最小值,那么最大值-次小值 差值缩小;
           如果移除的是其他数字 差值不变;
           这样的时间复杂度变为n*2。

3)以上两种方法在left和right移动的过程中都要不断进行min和max的判断,提高了时间复杂度。

在遍历过程中不断更新qmin和qmax。

其中补充两个关键点:

1)如果nums[i..j]满足条件, nums[k..j]  (i<= k <= j),都满足条件;

2)如果nums[i..j]不满足条件,所有包含 nums[i..j] 的数组都不满足条件;


AC代码:

class Solution
{
public:int getNum(vector<int> nums, int target){if(nums.empty())return 0;deque<int> qmin;    //保存窗口内的最小值,递增  front保存最小的元素位置deque<int> qmax;    //保存窗口内的最大值,递减  front保存最大的元素位置int i = 0, j = 0;   //nums[i..j]表示数组的范围int res = 0;        //表示满足条件的子数组数量//依次找到以nums[0],nums[1]...nums[N - 1]作为第一元素的子数组中满足条件的数量有多少个,累加while(i < nums.size()){while(j < nums.size())   // j向右拓展,直到不满足条件{while(!qmin.empty() && nums[qmin.back()] >= nums[j]) // 更新qmin中最小值的indexqmin.pop_back();qmin.push_back(j);while(!qmax.empty() && nums[qmax.back()] <= nums[j]) // 更新qmax中最大值的indexqmax.pop_back();qmax.push_back(j);if(nums[qmax.front()] - nums[qmin.front()] > target) //如果出现不满足条件的,那么包含以nums[i]起始的窗口的所有子数组都不满足条件break;j++;}if(qmin.front() == i)  // 如果窗口为 0 ,直接弹出qmin.pop_front();if(qmax.front() == i)  // 如果窗口为 0 ,直接弹出qmax.pop_front();res += j - i;          //如果nums[i..j]满足条件,则其子数组都满足条件, 一共 (j - i)个子数组i++;                   //继续寻找以nums[i]为起始点的子数组}return res;}};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql根据用户名查询数据_MySQL 查询数据

MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据。 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据。 语法 以下为在MySQL数据库中查询数据通用的 SELECT 语法: SELECT column_name,column_name FROM table_name [WHERE Clause…

quartz mysql索引_分布式系统中的定时任务全解(二)

在实际项目中&#xff0c;通常需要用到定时任务(定时作业)&#xff0c;spring框架提供了很好的实现。 1、 下载spring-quartz插件包 这里默认当前系统中是集成了spring框架的基本功能的。去网上下载spring定时器的jar包&#xff0c;这里用的是quartz-all-1.8.4.jar&#xff0c…

react div组件设置可点击不可点击_React面试全解

更新:收藏前点个赞亲&#xff0c;为啥我每次写的东西收藏都是赞的n倍&#xff01;&#xff01;花了一个月时间总结的React面试题 希望能帮助到你全文近万字建议保存仔细过一遍目录面试中常提的重要概念React生命周期ReduxRouter重要的方法面试中常提的重要概念1 什么是模块化是…

【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)

题干&#xff1a; 给出一个 n * n 的邻接矩阵A. A是一个01矩阵 . A[i][j]1表示i号点和j号点之间有长度为1的边直接相连. 求出从 1 号点 到 n 号点长度为k的路径的数目. 输入描述: 第1行两个数n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10) 第2行至第n1行&#xff0c;为一个邻接矩阵 …

【牛客 - 368D】动态连通块(并查集+bitset优化)

题干&#xff1a; 小T有n个点&#xff0c;每个点可能是黑色的&#xff0c;可能是白色的。 小T对这张图的定义了白连通块和黑连通块&#xff1a; 白连通块&#xff1a;图中一个点集V&#xff0c;若满足所有点都是白点&#xff0c;并且V中任意两点都可以只经过V中的点互相到达&a…

spark中读取json_【spark】文件读写和JSON数据解析

1.读文件通过 sc.textFile(“file://")方法来读取文件到rdd中。val lines sc.textFile("file://")//文件地址或者HDFS文件路径本地地址"file:///home/hadoop/spark-1.6.0-bin-hadoop2.6/examples/src/main/resources/people.json"HDFS文件地址"…

设python中有模块m、如果希望同时导入m中的所有成员_python-模块

先做几个练习题练习计算一个四乘四矩阵的所有元素的和&#xff0c;以及对角线之和#encodingutf-8a[[1,2,3,4],[2,5,2,3],[1,5,3,2],[5,3,2,5]]#encodingutf-8a[[1,2,3,4],[2,5,2,3],[1,5,3,2],[5,3,2,5]]total_sum0diagonal_sum0‘‘‘for i in a:print "i:",ifor j …

java 单例 饿汉式_Java-单例设计模式(懒汉与饿汉)

单例设计模式保证一个类在内存中只能有一个对象。思路&#xff1a;1)如果其他程序能够随意用 new 创建该类对象&#xff0c;那么就无法控制个数。因此&#xff0c;不让其他程序用 new 创建该类的对象。2)既然不让其他程序 new 该类对象&#xff0c;那么该类在自己内部就要创建一…

【牛客 - 369A】小D的剧场(线性dp)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/369/A 来源&#xff1a;牛客网 题目描述 "我明白。" 作为这命运剧场永远的观众&#xff0c;小D一直注视着这片星光璀璨的舞台&#xff0c;舞台上&#xff0c;少女们的身姿演绎出了一幕幕…

java button 圆角_UIButton具有渐变边框和圆角

我想要的是一个自定义UIButton&#xff0c;它有一个渐变边框(只是边框是渐变)和圆角 . 我几乎到了我想去的地方&#xff0c;但是角落有问题 . 这是我目前拥有的&#xff1a;这是我的代码&#xff1a;override func viewDidLoad() {super.viewDidLoad()let gradient CAGradient…

java获取xlsx某列数据_Java读取Excel指定列的数据详细教程和注意事项

本文使用jxl.jar工具类库实现读取Excel中指定列的数据。jxl.jar是通过java操作excel表格的工具类库&#xff0c;是由java语言开发而成的。这套API是纯Java的&#xff0c;并不依赖Windows系统&#xff0c;即使运行在Linux下&#xff0c;它同样能够正确的处理Excel文件。支持Exce…

java quartz 数据库_SpringBoot+Quartz+数据库存储

Spring整合Quartza、quartz调度框架是有内置表的进入quartz的官网http://www.quartz-scheduler.org/&#xff0c;点击Downloads&#xff0c;下载后在目录\docs\dbTables下有常用数据库创建quartz表的脚本&#xff0c;例如&#xff1a;“tables_mysql.sql”table_mysql.sqltable…

【CodeForces - 1062C】Banh-mi (贪心,数学,找规律,快速幂)

题干&#xff1a; JATC loves Banh-mi (a Vietnamese food). His affection for Banh-mi is so much that he always has it for breakfast. This morning, as usual, he buys a Banh-mi and decides to enjoy it in a special way. First, he splits the Banh-mi into nn pa…

【牛客 - 练习】约数个数的和(数论,数学)

题干&#xff1a; 给个n&#xff0c;求1到n的所有数的约数个数的和~ 输入描述: 第一行一个正整数n 输出描述: 输出一个整数&#xff0c;表示答案 示例1 输入 复制 3 输出 复制 5 说明 样例解释&#xff1a; 1有1个约数1 2有2个约数1,2 3有2个约数1,3 备注: n…

mysql json 创建索引_MySQL · 最佳实践 · 如何索引JSON字段

概述MySQL从5.7.8起开始支持JSON字段&#xff0c;这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能&#xff0c;至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能来对JSON对象中的字段…

mysql链路跟踪工具_EasySwoole利用链路追踪组件制作甩锅工具

前言最近前端老是反馈API调用异常&#xff0c;说请求成功但是没有数据返回&#xff01;我写的代码怎么可能有bug&#xff0c;肯定是前端调用的方式不对&#xff01;经过一番套鼓&#xff0c;直接把请求参数和响应内容打印到控制台&#xff0c;果然不出我所料&#xff0c;请求缺…

java selector 源码_Java NIO核心组件-Selector和Channel

昨天我们介绍了一下SelectorProvider和IO multiplexing.特别是IO multiplexing中的epoll系统调用,是Linux版本的Java的NIO的核心实现.那今天我们就来介绍一下, Java NIO中的核心组件, Selector和Channel.这两个组件,对于熟悉Java OIO,而不熟悉Java NIO的朋友来说,理解其作用是极…

python 爬虫 博客园_Python爬虫爬取博客园作业

分析一下他们的代码&#xff0c;我在浏览器中对应位置右键&#xff0c;然后点击检查元素&#xff0c;可以找到对应部分的代码。但是&#xff0c;直接查看当前网页的源码发现&#xff0c;里面并没有对应的代码。我猜测这里是根据服务器上的数据动态生成的这部分代码&#xff0c;…

java 与 xml_xml与java对象转换

public static void main(String[] args) {//java bean 转 xmlDept d new Dept();List staffs new ArrayList<>();Staff s1 new Staff("wuyun", 20);Staff s2 new Staff("lilei", 22);staffs.add(s1);staffs.add(s2);d.setDeptName("开放平…

【牛客 - 370H】Rinne Loves Dynamic Graph(分层图最短路)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/H 来源&#xff1a;牛客网 Rinne 学到了一个新的奇妙的东西叫做动态图&#xff0c;这里的动态图的定义是边权可以随着操作而变动的图。 当我们在这个图上经过一条边的时候&#xff0c;这个图上所…