给定一个数字' 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函数,但我想知道它是否可以进一步优化。
答案 0 :(得分:4)
首先,您获得n^2
个条目,其中最大的条目为n^2
,并且在可能的值范围内,只有少量值用于大n
}}。所以,我建议采用计数方法:
counts[]
的数组n^2
。values[]
,然后执行counts[values[i]-1]++
。values
数组重新初始化counts
数组,将i+1
的{{1}}值放入values
数组,counts[i]
给出。< / LI>
醇>
这就是全部。这是O(n^2)
,所以你几乎找不到更高效的解决方案。
答案 1 :(得分:3)
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)解决方案。