【程序员面试金典】面试题 17.18. 最短超串

python电子学会三级的零碎笔记 ‌示例‌:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s)‌:如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n'‌:这种方式首先将列表s中的每个元素通过空格连接成一个字符,然后在字符末尾添加一个换行符\n。 阅读详情

【程序员面试金典】面试题 17.18. 最短超串

题目描述

描述:假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。

返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。

示例 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

解题思路

思路:最直观的想法是,滑动窗口。使用need表示窗口内需要包含的元素以及对应个数,此处只记录small中出现的元素及个数,diff表示所需要覆盖的所有数字总和,minLen表示滑动窗口的最短长度。首先遍历一遍small填充need和diff,然后开始滑动窗口,l表示左边界,r表示右边界,当不满足条件时移动右边界而当满足条件时移动左边界,其中判断右边界时,如果当前元素在need中可以找到,则分为两种情况,第一种是need[i]大于0,即还需求该元素,那么need[i]和diff均减一,第二种是need[i]小于等于0,即不需求该元素甚至该元素还有多余,那么need[i]需要减一,其负数表示多余多少个,而diff不需要减一,因为此时是该元素多余,但是所需求的其他元素不变的,当diff等于0即表示满足要求,那么就可以开始移动左边界并更新最小滑动窗口,判断左边界时同理根据语义分析。注意,diff和need虽然是同步变化,但是两者又有些许不同,diff是大于等于0的,而need是可以小于0的,其负数表示该数多余的个数,故在变化时需要注意一些细节。

class Solution {
public:
    vector<int> shortestSeq(vector<int>& big, vector<int>& small) {
        int n=big.size();
        vector<int> res;
        //need表示窗口内需要包含的元素以及对应的个数
        unordered_map<int,int> need;
        //diff表示需要覆盖的所有数字总数
        int diff=0;
        //minLen表示滑动窗口的最短长度
        int minLen=n;
        //通过small统计need
        for(auto& e:small)
        {
            need[e]++;
            diff++;
        }
        //滑动窗口 l指向左边界 r指向右边界
        int l=0,r=0;
        //当不满足条件时移动右边界而当满足条件时移动左边界
        for(;r<n;r++)
        {
            //当前需要则需要个数以及覆盖个数均减一
            if(need.find(big[r])!=need.end())
            {
                //之前有需求则减去总需要 反之没有则不需要减去
                if(need[big[r]]>0)
                    diff--;
                //虽然diff和need[big[r]]是同步变化的 但是只有有需求才会减去diff 但无论如何都会减去need need为负数表示多余
                need[big[r]]--;
            }
            //如果diff为0则向左收缩窗口
            while(diff==0)
            {
                //更新最小窗口
                if(r-l<minLen)
                {
                    minLen=r-l;
                    res={l,r};
                }
                if(need.find(big[l])!=need.end())
                {
                    if(need[big[l]]>=0)
                        diff++;
                    need[big[l]]++;
                }
                l++;
            }
        }
        return res;
    }
};

总结:滑动窗口一般用于解决查找满足一定条件的连续区间的性质,比如在字符串或者数组中查找目标字符串或者数组所出现的最小区间。滑动窗口一般维护两个指针,即左指针和右指针,当窗口内元素尚未满足条件时,右指针右移,以探索未知区间,当窗口内元素已经满足条件时,左指针右移,以获得更小区间。

高薪程序员&Java面试题精讲系列汇总 因为CSDN没有分类归纳博客的功能,所以特写本帖汇总《高薪程序员面试题精讲系列教程》,方便大家查阅!希望各位小伙伴,可以从我的拙作中能对Java的高频面试题有所掌握,也希望各位可以多给与指教!目前本系列文章持续更新中,敬请关注...... 如果你觉得本系列博文对你有帮助,请给个 点赞评论 吧,手写博文不易,一篇文章可能得花一两天的时间才能写好,你的支持是我坚持下去的动力! 本系列面试题涵盖的内容如下所示: 面试题系列文章链接: 高薪程序员&面试题精讲系列01之开篇介绍 高薪程序员&a. 阅读详情

相关推荐

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2936

程序员面试面试题 17.18. (双指针+哈希)

1. 题目 假设你有两个数组,一个一个的元素均不相同。 找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。 若不存在,返回空数组。 示例 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 来源:力扣

自动控制原理ppt

本科高校自动控制原理课程课件ppt。自动控制——是指在没有人直接参与的情况下,利用外加设备或控制装置使生产过程或被控对象中的某一物理量或多个物理量自动地按照期望的规律去运行或变化。

【leetcode】面试题1:,详解滑动窗口

假设你有两个数组,一个一个的元素均不相同。找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。若不存在,返回空数组。 示例 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 <=

xintu1314的博客 506

面试题 17.18. 【中等题】 假设你有两个数组,一个一个的元素均不相同。找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。若不存在,返回空数组。 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出:...

算法岗从零到无穷 637

Leetcode之面试题17.18——

题目: 假设你有两个数组,一个一个的元素均不相同。找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。若不存在,返回空数组。 示例 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.lengt

qq_35455503的博客 468

面试题 17.18.

题目描述: 假设你有两个数组,一个一个的元素均不相同。找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。若不存在,返回空数组。 示例: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,10] 输入: big = [1,2,3] small = [4] 输出: [] 解题思路: 这道题就是滑动窗口的经题目,我们首先

shendumengxin的博客 282

(滑动窗口解法)

面试题 17.18. 假设你有两个数组,一个一个的元素均不相同。找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。若不存在,返回空数组。 示例 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] 输出: [] 代码如

m0_48810566的博客 487

程序员面试 - 面试题 17.18.

题目难度: 中等今天继续更新程序员面试系列, 大家在公众号里回复就能看到该系列当前连载的所有文章了, 记得关注哦~

随便发挥的博客 175

程序员面试 - 面试题 17.18. (双指针+哈希)

1. 题目 假设你有两个数组,一个一个的元素均不相同。 找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。 若不存在,返回空数组。 示例 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] 示...

Michael是个半路程序员 1421

程序员面试总结 - leetcode 程序员面试系列

程序员面试总结

随便发挥的博客 852

程序员面试(第 6 版)

程序员面试(第 6 版) 力扣 (LeetCode)

[ 25'h ] 1582

2020新Java常见面试题及答案

Java新常见面试题 + 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示: 可...

wu的BLOG的博客 5万+

LeetCode程序员面试(第 6 版)中

LeetCode程序员面试(第 6 版)中

u011895157的博客 1231

算法专题】《程序员面试 - 学习计划 - 力扣(LeetCode)》学习大纲 & 学习笔记(持续更新中......)

算法专题】程序员面试 - 学习计划 - 力扣(LeetCode)

Shipley_Leo的博客 3394

【unordered_map】在数组中找出包括某集合所有元素的子数组

题目:EPI 搜狗实习生面试中出现过类似的题。那道题是“给出一个字符,以及字符中出现过的所有字符,找出一个,该字包括出现过的所有字符”。

bupt8846的专栏 1425

c#合并数组 ,剔除重复项等操作

1.将相同的内容及不同的内容分别存取,以及两个数组合并 string[] a = m_consu.Split(',');//数组1 string[] b = Consultant.TrimEnd(',').Split(',');//数组2 //将两个数组合在一起,不剔除重复项 string[] c = a.Concat(b).ToArray<string>(); //比较两个数组...

墨水直达的博客 3661

python实现 从一个数组中找到完全含有另一个数组元素的子数组

#找出数组strW中包含strA所有元素的少情况 strA=['testing','pattern'] strW=['hello','this','is','a','testing','page','description','testing','pattern','all','is','about','testing'] start=0 end=0 abstractstart=0 #子数组

helina00的专栏 2977

2021-10-1面试题 17.18. 4

题目 假设你有两个数组,一个一个的元素均不相同。找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。若不存在,返回空数组。 示例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] 输出: [] 分析: 滑动窗口算法 class Sol

chenghaoy的博客 197

面试题 17.18. (滑动窗口)

1. 问题描述: 假设你有两个数组,一个一个的元素均不相同。找到数组包含数组所有的元素的子数组,其出现顺序无关紧要。 返回子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点小的一个。若不存在,返回空数组。 示例 1: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,1...

二哈 610
上一篇: 【每日一题】1681. 最小不兼容性
下一篇: 【每日一题】1253. 重构 2 行二进制矩阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值