https://leetcode-cn.com/problems/super-ugly-number/
看见这个题目的时候只能大概记得分成几行,然后每一行取最小的,那个最小的行乘一个数,具体怎么做以及忘记。
丑数在leetcode里面有几道题,得先做完前面的,好做后面的。
263. 丑数
class Solution {
public boolean isUgly(int n) {
if(num == 0) return false;
boolean is = false;
while(num%2 == 0) num = num/2;
while(num%3 == 0) num= num/3;
while(num%5 == 0) num = num/5;
if(num == 1) return true;
return false;
}
}
264. 丑数 II
有两种方法,第一种是通过堆,和set实现。堆来取最小的,set来去重。
第二种通过指针的办法,但因为存在重复的情况,有可能index会一起加,所以不能用else if。且第一个数为1.数组循环的话必须从i=1开始。
public int nthUglyNumber(int n) {
if (n < 6) return n;
int ugly[] = new int[n];
ugly[0] = 1;
int factor2 = 2, factor3 = 3, factor5 = 5;
int index2 = 0, index3 = 0, index5 = 0;
for (int i = 1; i < n; i++) {
int min = Math.min(factor2, Math.min(factor3, factor5));
ugly[i] = min;
if (factor2 == min)
factor2 = 2 * ugly[++index2];
if (factor3 == min)
factor3 = 3 * ugly[++index3];
if (factor5 == min)
factor5 = 5 * ugly[++index5];
}
return ugly[n-1];
}
本题的思路和264题的解题思路一模一样。
public int nthSuperUglyNumber(int n, int[] primes) {
int[] array = new int[n];
int[] indexs = new int[primes.length];
int[] nums= Arrays.copyOf(primes, primes.length);
array[0] = 1;
if (n == 1) return 1;
for (int i = 1; i < n; i++) {
int min = Arrays.stream(nums).min().getAsInt();
array[i] = min;
for (int j = 0; j < nums.length; j++) {
if (min == nums[j]) {
indexs[j]++;
nums[j] = array[indexs[j]] * primes[j];
}
}
}
return array[n-1];
}









网友评论