一个用例:如果您想知道在向量上前进时有多少项目更小或相等。约束:i < = j,有多少个 v[i] 小于或等于 v[j])。让我们将它插入到地图或集合中。
vector<int> v={1, 4, 2, 3};
set<int> s;
s = {1}; // 1's position is 1 (one based)
s = {1,4}; //4's positon is 2
s = {1, 2, 4} ;//2's position is 2
s = {1 , 2, 3, 4}; //3's positon is 3
似乎 std:distance 需要 O(n) 时间。我可以使用 set.lower_bound() 并向后计数直到 set.begin() 来实现相同的效果。有没有人有比要求 O(n) 更好的解决方案,也许使用额外的数据结构?
好的,再想一想,这里是针对这个特定问题存储索引(基于 1)的解决方案。但是,它可能无法解决在完成的地图中获取正确项目索引的问题。
vector<int> arr={1 , 1 , 2, 4, 2};
multimap<int, int> track;
for(auto a:arr)
{
auto it = track.insert(make_pair(a, 1)); //first item is 1
if(it!=track.begin())
{
--it;
int prev=it->second;
it++;
it->second+=prev;
}
cout<<a<<','<<it->second-1<<endl;
}