看起来像一个动态规划。
可能这会有所帮助
这是一个 O(n) 算法
1.声明一个say max size say 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 and 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} 这是您想要的输出。
//伪代码
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)
为了更好地理解算法,拿纸和笔进行试运行。这将有助于更好地理解。
希望对你有帮助
快乐编码!