[英]What is the fastest way to sort these n^2 numbers?
给定数字'n',我想返回包含k1 * k2的所有值的n ^ 2个数的排序数组,其中k1和k2的范围可以从1到n。
例如,对于n = 2,它将返回:{1,2,2,4}。(该数字基本上是1 * 1,1 * 2,2 * 1,2 * 2)。
对于n = 3,它将返回:{1,2,2,3,3,4,6,6,9}。
(数字为:1 * 1,2 * 1,1 * 2,2 * 2,3 * 1,1 * 3,3 * 2,2 * 3,3 * 3)
我尝试使用c ++标准库中的sort函数,但我想知道它是否可以进一步优化。
好吧,首先,你得到n^2
个条目,其中最大的条目是n^2
,并且在可能的值范围内,只有很少的值用于大n
。 所以,我建议采用计数方法:
n^2
的数组counts[]
。 values[]
,并counts[values[i]-1]++
。 counts
数组重新初始化values
数组,将count i+1
counts[i]
给出的i+1
values
放入values
数组中。 就这样。 它是O(n^2)
,所以你几乎找不到更高效的解决方案。
vector<int> count(n*n+1);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
++count[i*j];
for (int i = 1; i <= n*n; ++i)
for (int j = 0; j < count[i]; ++j)
cout << i << " ";
这实质上是cmaster答案中描述的O(n * n)解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.