【LeetCode】面试题17.18 最短超串(典型滑动窗口)
题目链接
https://leetcode-cn.com/problems/shortest-supersequence-lcci/
题目描述
假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。
返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。
示例 1: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,10] 示例 2: 输入: big = [1,2,3] small = [4] 输出: [] 提示: big.length <= 100000 1 <= small.length <= 100000
解题思路
1.典型利用滑动窗口
定义滑动窗口为[left,right],当滑动窗口内的元素满足small数组,则把left与right的值都设置为从left下标开始第二次出现small数组中的元素的下标。例如big数组[1,2,3,5,7,6],small数组[1,3,5],当left = 0,right = 3时,滑动窗口满足small元素,则把left与right值设置为2。然后继续重复以上操作。自己想的滑动窗口最终因为超时没能AC,但是所有用例都通过了。
标准的滑动窗口:
1.把[left,right]称为一个窗口;
2.先右移右指针扩大窗口,直到窗口中的数字满足small数组要求;
3.满足要求时,停止增加right,转而增加left缩小窗口,直到不满足要求
4.重复2,3步直到right走到big尽头
滑动窗口的模板:
int left = 0, right = 0; //left right为双指针
while (right < s.size())
{
window.add(s[right]);
right++; //右移右指针扩大窗口
while (valid) //直到窗口中的数字满足small数组要求;
{
window.remove(s[left]); //满足要求时,停止增加right,转而增加left缩小窗口,直到不满足要求
left++;
}
}
AC代码
1 class Solution { 2 public: 3 vector<int> shortestSeq(vector<int>& big, vector<int>& small) { 4 vector<int> ans; 5 if(small.size()>big.size()) return ans; 6 map<int,int>b_mp; 7 map<int,int>s_mp; 8 for(int i = 0; i < small.size(); i++) s_mp[small[i]]++; 9 int count = 0; 10 int l = 0; 11 int r = 0; 12 int l_ans=-1; 13 int r_ans=-1; 14 int max = INT_MAX; 15 while(l <= r && r < big.size()) 16 { 17 if(s_mp[big[r]] == 0) //右指针右移,扩大窗口 18 { 19 r++; 20 continue; 21 } 22 else 23 { 24 b_mp[big[r]]++; 25 if(b_mp[big[r]] == 1) count++; 26 } 27 28 if(count == small.size()//valid条件) //整个if语句对应模板中 window.remove(s[left]);【开始缩小滑动窗口->对l的值进行处理】 29 { 30 while(l <= r) 31 { 32 if(b_mp[big[l]] == 0) l++; 33 else if(b_mp[big[l]] == 1) break; 34 else if(b_mp[big[l]] > 1) //本句代码是为了处理如下例子:big数组[1,2,1,3,5,7,6],small数组[1,3,5] 35 { 36 b_mp[big[l]]--; 37 l++; 38 } 39 } 40 int len = r - l; 41 if(len < max) //迭代更新len值 42 { 43 max = len; 44 l_ans = l; 45 r_ans = r; 46 } 47 } 48 r++; 49 } 50 if(max != INT_MAX) 51 { 52 ans.push_back(l_ans); 53 ans.push_back(r_ans); 54 } 55 56 return ans; 57 } 58 };
原文地址:https://www.cnblogs.com/XDU-Lakers/p/12922749.html
- 被曝大裁员!曲德君坚称万达网科没有倒下、目标决心不变
- Linux下smokeping网络监控环境部署记录
- Linux下的rsyslog系统日志梳理(用户操作记录审计)
- 数据结构之数组封装
- Centos下内网NDS主从环境部署记录
- 一搜解决,微信的这个功能厉害了!
- Saltstack自动化操作记录(2)-配置使用
- Saltstack自动化操作记录(1)-环境部署
- CentOS源码编译安装Nginx和tcp_proxy module
- 介绍一个MonoTouch开发的伦敦官方城市指南应用
- 虾说区块链-55-《精通比特币》笔记十
- SignalR QuickStart
- Node.js入门学习笔记-IDE选择/配置之WebStorm(windows)
- Captcha插件后门分析和修复
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 组复制常规操作-分布式恢复 | 全方位认识 MySQL 8.0 Group Replication
- 赞!7000 字学习笔记,MySQL 从入到放弃
- 面试官问我Volatile的原理?从操作系统层面的设计怼回去!
- 设计原则之单一职责
- 设计原则之开闭原则
- SpringBoot执行跨域处理
- SpringBoot对全局异常的处理封装
- 自定义springboot-starter揭秘自动配置骚操作
- 【大厂面试题】Redis中是如何实现分布式锁的?
- 最近公司招人,研发组商量了下,暂时定下这么多java面试题!
- 市面上数据库种类那么多,如何选择?
- 玩转正则!推荐一个速查、调试、验证、可视化工具
- 当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?
- Js实现文本复制
- 当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?处理器映射器与处理器篇