我们可以找到线性时间复杂度为 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))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...