!!!!!【此文章仅仅用于记录自己做题,文章毫无用处⚆_⚆】
此题要在前两道题的前提下做,对题目理解会好些,一开始题目没看懂,看了讨论有人说要看看前两道关于丑数的题。263.丑数、264.丑数Ⅱ。所以先做了前两道题。
目录
263.丑数
一、题目:
二、解答以及代码:
题目较简单,将三个数2,3,5存入数组中,while循环除(比如2)直至除不尽,则到下一个数(比如3)继续while循环。
官方解答比较容易理解
class Solution {
public boolean isUgly(int n) {
if (n<=0)
return false;
int []ugly={2,3,5};
for(int nums:ugly)//foreach型数组遍历
{
while(n%nums==0)//一直除nums直至除不尽,就到出循环,到下一个数
n/=nums;
}
return n==1;//简化版。即若n==1则true除尽了,若n!=1,则为false
}
}
public class MainClass {
public static String booleanToString(boolean input) {
return input ? "True" : "False";
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int n = Integer.parseInt(line);
boolean ret = new Solution().isUgly(n);
String out = booleanToString(ret);
System.out.print(out);
}
}
}
264.丑数Ⅱ
一、题目
二、解答
官方解答只是用了第二种动态规划。第一种是最小堆,然后又哈希集合来避免重复,还没有看懂,就只使用了动态规划方法。
官方解释挺详细易懂的。
解法:动态规划
三、代码
class Solution {
public int nthUglyNumber(int n) {
int []dp=new int[n+1];
dp[1]=1;
int p1=1,p2=1,p3=1;
for(int i=2;i<=n;i++)
{
int num2=dp[p1]*2,num3=dp[p2]*3,num5=dp[p3]*5;
dp[i] = Math.min(Math.min(num2, num3), num5);
if(dp[i]==num2)
p1++;
if(dp[i]==num3)
p2++;
if(dp[i]==num5)
p3++;
}
return dp[n];
}
}
313.超级丑数
一、题目
二、解答
这道题和「264. 丑数 II」相似,区别在于,第 264 题规定丑数是只包含质因数 2、3 和 5 的正整数,这道题规定超级丑数是只包含数组primes 中的质因数的正整数。
这道题可以使用第 264 题的方法,包括最小堆和动态规划。
同样只使用了官方的第二种解法动态规划
三、代码
class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int m=primes.length;
int []dp=new int[n+1];
dp[1]=1;
int []pointer=new int[m];//每个所给质数指针,相当于264丑数二中的p1p2p3;
Arrays.fill(pointer,1);//都初始化为1
for(int i=2;i<=n;i++)
{
int []num=new int[m];
int minNum=Integer.MAX_VALUE;
for(int j=0;j<m;j++)
{
num[j]=dp[pointer[j]]*primes[j];
minNum=Math.min(minNum,num[j]);
}
dp[i]=minNum;
for(int j=0;j<m;j++)
if(minNum==num[j])
pointer[j]++;
}
return dp[n];
}
}