如何解决我们可以找到线性时间复杂度为 O(n) 的数组中每个元素的秩吗?
我正在尝试解决 this Leetcode problem,它被要求解决:
给定一个整数数组 arr,用它的等级替换每个元素。 例如:
输入:arr = [40,10,20,30]
输出:[4,1,2,3]
说明:40 是最大的元素。 10是最小的。 20 是第二小的。 30 是第三小的。
我的代码如下:
class Solution {
public:
vector<int> arrayRankTransform(vector<int>& arr) {
multimap<int,int> numbetoIndexrMap;
int size = arr.size();
vector<int> rank(size,10);
for(int i = 0; i < size; ++i){
numbetoIndexrMap.insert({arr[i],i});
}
int rankIndex = 1;
int prevIoUs = INT_MIN;
for(auto i = numbetoIndexrMap.begin(); i != numbetoIndexrMap.end(); ){
int currentNumber = i -> first;
rank[i->second] = rankIndex;
++i;
if(i != numbetoIndexrMap.end() && i -> first != currentNumber) ++rankIndex;
}
return rank;
}
};
我发现我们可以使用Sorting/Map来解决这个时间复杂度为O(NlogN)的问题。我的问题是我们是否可以在线性时间 O(n) 上做到这一点?
解决方法
即使在那个问题的提示部分,他们也希望我们对数组进行排序,这本身需要 O(nlog(n))
的时间复杂度。在这里,排序并不重要,而是解决方案的必要部分。因此,不同之处在于您如何从该排序数组中搜索排名。
天真的方法是使用 index
each
在已排序数组中找到原始数组的 linear search
元素的 O(n)
。所以总体时间复杂度为 O(n*n)
。
最好的方法是使用 binary search
O(log(n))
在排序数组中找到原始数组的每个元素的索引。所以总体时间复杂度为 O(n*log(n))
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。