マップを使用する場合は、地図のマップを最小1つと最大1つ作成することです。これにはいくつかの前処理時間がかかりますが、コストが長期間にわたり多くのルックアップを使って償却されるため、全体的に速くなります。
あなたは基本的にすべての有効な最小のキーを持つマップを作成している、とそれぞれ値そのmimumumごとに有効な最大のキーを持つマップ..例えば
(用心、内部テストされていないバック・オブ封筒コード):!
// Psuedo-ish C++11
typedef std::map<int, std::vector<R>> MaxMap;
typedef std::map<int, MaxMap> MinMap;
MinMap minMap;
// Build maps
for(range : R)
{
for(int i=range.min; i<=range.max; ++i)
{
MaxMap& maxMap = minMap[i];
for(int j=range.min; j<=range.max; ++j)
{
// We just need some value in the map,
// so might as well store a list of the original ranges..
mapMap[j].push_back(range);
}
}
}
が次に検索に、あなたの分の値を取り、MinMapでそれを見て、その後、MaxMapであなたの最大値を調べます。もちろん、
bool isValidRange(int min, int max)
{
MinMap::iterator minIt = minMap.find(min);
if(minIt == minMap.end())
{
return false;
}
MaxMap& maxMap = minIt->second;
MaxMap::iterator maxIt = maxMap.find(max);
if(maxIt == maxMap.end())
{
return false;
}
return true;
}
... MinMapは、任意の最小のためにあなたのすべての有効な最大値を与え、あなたの最大値が与えられた最小の有効な最大値である場合、MaxMapであなたの検索があなたに伝え、これだけを覚えておいてください自然数のために働く。あなたの範囲でネガや真実が必要な場合は、別のものが必要です...
あなたはセグメントツリーに興味があるかもしれません。 –
問題は十分に明確ではありません。より具体的な例を挙げてください。ペアの両方の要素が特定の範囲内にあるようにしますか?ペアは範囲を表していますか?範囲(1,4)、(7,9)ペア(3,8)の結果はどうなるのですか? –
私はそれが十分明確だと思いますか? 3と8の両方が存在する範囲がないため、これはfalseを返すはずです。 @A。 – SinByCos