题目描述:
假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。
返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。
示例:
输入:
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]
输出: []
解题思路:
这道题就是滑动窗口的经典题目,我们首先确定一个窗口,窗口的左右边界分别是right,left。借助hash表来存储在窗口中的元素,用来查看当前的窗口是否包含small里面所有的元素,如果不包含就右移右指针,如果是包含就查看当前的窗口是不是比我们保存的窗口小,如果小的话就更新窗口大小。
代码如下:
class Solution {
public:
vector<int> shortestSeq(vector<int>& big, vector<int>& small) {
int left=0,right=0;//用于记录当前左右指针的位置
int l=0,r=0;//用于记录当前满足条件的窗口的位置,且当前满足的是最小最左的窗口
unordered_map<int,int> m;//记录当前窗口中的元素个数,用来判断是否超出范围
int len = INT_MAX;
bool temp = false;
while(right<big.size()){
if(temp == false)m[big[right]]++;
for(int s:small){
if(m[s]==0){
temp=false;
break;
}
temp=true;
}
if(temp==false){
right++;
}else{
if(right-left < len){
len = right-left;
l = left;
r = right;
}
m[big[left]]--;
left++;
}
}
if(len==INT_MAX)return {};
return {l,r};
}
};