Я сталкивался с этой проблемой и задавался вопросом, может ли быть лучшая сложность, чтобы решить проблему.
Например,
- массив a = [1,4,2,4]
- массив b = [3,5]
ЖЕЛАЕМЫЙ ВЫХОД ==> [2, 4]
РЕДАКТИРОВАТЬ: поставить другой пример
- массив a = [1,4,2,4]
- массив b = [3, 1000000]
желаемый выход ==> [2,4]
Пока что то, что я нашел и попробовал, работает в O (nlogn) + O (blogn) и O (n).
O (nlogn) + O (blogn) подход:
int binarysearch(vector<int>arr, int l, int r, int target)
{
int mid;
while(l <= r)
{
mid = (r+l) / 2;
if(arr[mid] > target)
r = mid - 1;
else
l = mid + 1;
}
return r;
}
vector<int> counts(vector<int> a, vector<int> b)
{
vector<int> result;
sort(a.begin(), a.end()); // O(nlogn)
for(auto i : b){
int count = binarysearch(a, 0, a.size()-1, b); // b*O(log n) times
result.push_back(count)
}
return result;
}
O (n) подход:
vector<int> counts(vector<int> a, vector<int> b)
{
vector<int> result;
int maxi = *max_element(b.begin(), b.end()) + 1;
int mymap[maxi] = {0};
for(auto i : a) mymap[i]++;
for(int i = 1; i < maxi; i++){
mymap[i] = mymap[i] + mymap[i-1];
}
for(auto i : b){
result.push_back(mymap[i]);
}
return result;
}