前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员面试金典 - 面试题 17.18. 最短超串(双指针+哈希)

程序员面试金典 - 面试题 17.18. 最短超串(双指针+哈希)

作者头像
Michael阿明
发布2020-07-13 15:40:53
2850
发布2020-07-13 15:40:53
举报

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shortest-supersequence-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 双指针,small 插入哈希 set
  • 哈希map记录区间 [i,j] 内存在于 set 内的元素的个数,当map计数为0是,将其删除
  • 维持map.size == set.size,map的size不够,j++,够了,i++
class Solution {
public:
    vector<int> shortestSeq(vector<int>& big, vector<int>& small) {
    	if(big.size() < small.size())
    		return {};
    	int i=0, j=0, n = big.size(), k = small.size(), minLen = INT_MAX;
    	vector<int> ans(2,-1);
    	unordered_set<int> s;
    	unordered_map<int,int> m;
    	for(int c : small)
    		s.insert(c);
    	while(j < n)
    	{
    		while(j < n && m.size() < k)
    		{
    			if(s.count(big[j]))
    				m[big[j]]++;
    			j++;
    		}
    		while(i < j && m.size()==k)
    		{
    			if(j-i < minLen)
	    		{
	    			minLen = j-i;
	    			ans[0] = i, ans[1] = j-1;
	    		}
    			if(s.count(big[i]))
    			{
    				m[big[i]]--;
    				if(m[big[i]]==0)
    					m.erase(big[i]);
    			}
    			i++;
    		}
    	}
    	if(ans[0]==-1)
    		return {};
    	return ans;
    }
};

372 ms 54.2 MB

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档