トピックリンク
アイデア:
- マルチマップを使用して、各要素を(要素値、グループ)の形式で2次元ベクトルに格納します。要素値は繰り返される可能性があるため、ここではマルチマップを使用して格納します。
- スライドウィンドウを使用して、マルチマップに格納されている要素を最初から最後まで直線的にトラバースし、マップを使用して、トラバースされた要素のグループの数を記録します。
- map.size()に各グループが含まれていることが検出されると、ウィンドウの左端が縮小され、処理中に左端と右端の最小差が記録されます。
- 最終的な左と右の値が答えです
class Solution {
public:
vector<int> smallestRange(vector<vector<int>>& nums) {
multimap<int,int>div;
map<int,int>temp;
for(int i=0;i<nums.size();i++)
{
for(int j=0;j<nums[i].size();j++)
{
div.insert(pair<int,int>(nums[i][j],i));
}
}
auto left=div.begin();
auto right=div.begin();
int res=INT_MAX;
int k=nums.size();
int l=0,r=0;
vector<int> ans;
while(right!=div.end())
{
temp[right->second]++;
while(temp.size()==k)
{
if(right->first-left->first<res)
{
res=right->first-left->first;
l=left->first;
r=right->first;
}
temp[left->second]--;
if(temp[left->second]==0)
{
temp.erase(left->second);
}
left++;
}
right++;
}
if(res!=INT_MAX)
{
ans.push_back(l);
ans.push_back(r);
}
return ans;
}
};