作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以问题是:
编写一个程序,找出第n个 super 丑数。
super 丑数是正数,其所有素因子都在给定的大小为 k 的素数列表素数中。例如,[1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] 是给定质数 = [2, 7, 13, 19] 的前 12 个 super 丑数的序列尺寸为 4。
所以我的算法基本上使用它们遵循的模式找到所有可能的因素,将它们推送到一个数组,对该数组进行排序,然后返回数组中的第 n 个值。它准确地计算了所有这些,但是,对于高 n 值来说太慢了。
我的问题是执行此操作的正确方法是什么,因为我确信必须有更直接的解决方案。我主要好奇找到它背后的理论,以及是否有某种封闭公式。
var nthSuperUglyNumber = function(n, primes) {
xprimes = primes;
var uglies = [1];
uglies = getUglyNumbers(n, primes, uglies);
// return uglies[n-1];
return uglies[n - 1];
};
// 3 4
//1, 2,3,5, || 4,6,10, 9,15, 25, || 8,12,20,18,30,50, 27,45,75, 125 ||
// 3,2,1 6,3,1, 10,4,1
// 1 1 1
//1, 2,3 || 4,6, 9, || 8,12,18, 27 || 16,24,36,54, 81
// 2,1 3,1 4,1 5,1
//
//1, 2,3,5,7 || 4,6,10,14 9,15,21 25,35, 49 ||
// 4,3,2,1 || 10,6,3,1
var getUglyNumbers = function(n, primes, uglies) {
if (n == 1) {
return uglies;
}
var incrFactor = [];
var j = 0;
// Initial factor and uglies setup
for (; j < primes.length; j += 1) {
incrFactor[j] = primes.length - j;
uglies.push(primes[j]);
}
//recrusive algo
uglies = calcUglies(n, uglies, incrFactor);
uglies.sort(function(a, b) {
return a - b;
});
return uglies;
};
var calcUglies = function(n, uglies, incrFactor) {
if (uglies.length >= 5 * n) return uglies;
var currlength = uglies.length;
var j = 0;
for (j = 0; j < xprimes.length; j += 1) {
var i = 0;
var start = currlength - incrFactor[j];
for (i = start; i < currlength; i += 1) {
uglies.push(xprimes[j] * uglies[i]);
}
}
// Upgrades the factors to level 2
for (j = 1; j < xprimes.length; j += 1) {
incrFactor[xprimes.length - 1 - j] = incrFactor[xprimes.length - j] + incrFactor[xprimes.length - 1 - j];
}
return calcUglies(n, uglies, incrFactor);
};
最佳答案
public static ArrayList<Integer> superUgly(int[] primes,int size)
{
Arrays.sort(primes);
int pLen = primes.length;
ArrayList<Integer> ans = new ArrayList<>();
ans.add(1);
PriorityQueue<pair> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(p -> p.value));
HashSet<Integer> hashSet = new HashSet<>();
int next_ugly_number;
int[] indices = new int[pLen];
for(int i=0;i<pLen;i++) {
hashSet.add(primes[i]);
priorityQueue.add(new pair(i,primes[i]));
}
while(ans.size()!=size+1)
{
pair pair = priorityQueue.poll();
next_ugly_number = pair.value;
ans.add(next_ugly_number);
indices[pair.index]+=1;
int temp = ans.get(indices[pair.index])*primes[pair.index];
if (!hashSet.contains(temp))
{
priorityQueue.add(new pair(pair.index,temp));
hashSet.add(temp);
}
else {
while(hashSet.contains(temp))
{
indices[pair.index]+=1;
temp = ans.get(indices[pair.index])*primes[pair.index];
}
priorityQueue.add(new pair(pair.index,temp));
hashSet.add(temp);
}
}
ans.remove(0);
return ans;
}
对类是
class pair
{
int index,value;
public pair(int i,int v)
{
index = i;
value = v;
}
}
它返回一个大小为“size”的丑陋数字列表。
我正在使用优先级队列来为每个循环找到最小值,还使用哈希集来避免优先级队列中的重复条目。
所以它的时间复杂度是 O(n log(k))
其中 n
是大小,k
是素数数组大小。
关于performance - super 丑数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34103076/
1.题目 丑数就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n ,请你判断 n 是否为丑数 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:n = 6 输出:t
所以问题是: 编写一个程序,找出第n个 super 丑数。 super 丑数是正数,其所有素因子都在给定的大小为 k 的素数列表素数中。例如,[1, 2, 4, 7, 8, 13, 14, 16, 1
我是一名优秀的程序员,十分优秀!