假设我有一个输入数组,其中所有对象都是非等价的 - 例如[13,2,36]。我希望输出数组为[1,0,2],因为13大于2所以“1”,2大于无元素所以“0”,36大于13和2所以“2”。如何使输出数组的效率优于O(n2)? 编辑1:我还想以相同的顺序打印输出。如果可能,请提供c / c ++代码。
答案 0 :(得分:0)
克隆原始数组(并保留元素的原始索引)并快速排序。快速排序数组中元素的值应为quicksorted.length - i
,其中i
是新快速排序数组中元素的索引。
[13, 2, 36] - original
[36(2), 13(1), 2(0)] - sorted
[1, 0, 2] - substituted
答案 1 :(得分:0)
def sort(array):
temp = sorted(array)
indexDict = {temp[i]: i for i in xrange(len(temp))}
return [indexDict[i] for i in array]
我意识到它在python中,但仍然应该帮助你
答案 2 :(得分:0)
Schwartzian变换:装饰,排序,不装饰。
创建一个包含对象和索引的结构。从列表中创建这些结构的新列表。按计划按对象排序。从排序列表中创建索引列表。
答案 3 :(得分:0)
似乎像动态编程。 可能这可以帮助 这是一个O(n)算法
1.声明一个最大尺寸为1000001的数组;
2.遍历所有元素并使arr [input [n]] = 1,其中input [n]是元素
3.遍历arr并添加上一个索引(以保持arr [i]的记录大于多少元素)这样
arr[i]+=arr[i-1]
示例:如果输入[] = {12,3,36}
在第2步之后
ARR [12] = 1,ARR [3] = 1,ARR [36] = 1;
在第3步之后
ARR [3] = 1,ARR [4] = ARR [3] + ARR [4] = 1(ARR [4] = 0,ARR [3] = 1),
ARR [11] = ARR [10] = ARR [9] = ARR [8] = ARR [7] ARR [6] = ARR [5] = ARR [4] = 1
ARR [12] = ARR [11] + ARR [12] = 2(ARR [11] = 1,ARR [12] = 1)
arr [36] = arr [35] + arr [36] = 3(因为arr [13],arr [14],... arr [35] = 2而arr [36] = 1)
4.遍历输入数组,打印arr[input[i]]-1
,其中i是索引。
所以arr [3] = 1,arr [12] = 2,arr [36] = 3;
如果你打印arr [input [i]],那么输出将是{2,1,3}所以我们需要从每个元素中减去1,然后输出变为{1,0,2},这是你想要的输出。
// pseude code
int arr[1000001];
int input[size];//size is the size of the input array
for(i=0;i<size;i++)
input[i]=take input;//take input
arr[input[i]]=1;//setting the index of input[i]=1;
for(i=1;i<1000001;i++)
arr[i]+=arr[i-1];
for(i=0;i<size;i++)
print arr[input[i]]-1;//since arr[i] was initialized with 1 but you want the input as 0 for first element(so subtracting 1 from each element)
要更好地理解算法,请用纸和笔进行干运行。这将有助于更好地理解。
希望它有所帮助 快乐编码!!