力扣每日一题——263、丑数解答
263、丑数
题目链接:
丑数
看着本题的题目我们知道什么是丑数质因子只含有5、3、2的数,而且只需要判断传进来的数是否为丑数,这样就好办了,我们直接上代码
采用除法+取余运算
当我们传进来一个数,分别与5、3、2做除法运算,要是最终的结果等于1则表示它是丑数,这么说大家可能不太理解,我直接上代码
class Solution {
public boolean isUgly(int n) {
if(n < 1) return false;
while(n % 5 == 0){
n /= 5;
}
while(n % 3 == 0){
n /= 3;
}
while(n % 2 == 0){
n /= 2;
}
return n == 1;
}
}
如果进来的数是11,11对5、3、2取余都不等于0吧、也就是说我丑数除1以外的正整数必须对5、3、2其中一个的取余等于0,这样就能做出来了
剑指offer 49、丑数
与上一题不同的是,传进来的n,是我们从0开始需要找到的第n个丑数,这就需要我们去记录从1开始每次找到的丑数,当找到第n个时,就是我们需要的那个数了
题目链接:
说到状态记录,我第一时间想到的就是动态规划,动态规划就是将每次计算的结果记录下来,以便下一次计算使用到前面计算的结果,我们直接上代码,然后讲思路
动态规划
class Solution {
public int nthUglyNumber(int n) {
int[] dp = new int[n];
int a = 0,b = 0,c = 0;
dp[0] = 1;
for(int i = 1;i<n;i++){
dp[i] = Math.min(dp[a] * 2,Math.min(dp[b]*3,dp[c]*5));
//都使用if的原因是该丑数可能同时是某两个质因子的丑数
if(dp[i] == dp[a]*2) a++;
if(dp[i] == dp[b]*3) b++;
if(dp[i] == dp[c]*5) c++;
}
return dp[n-1];
}
}
思路:
1.首先我们定义一个数组,里面存放的就是我们找到的丑数,该dp数组的第一个数必然是1,也就是dp[0] == 1
,我们还定义了三个int型数字是a、b、c,分别对应了质因子为2、3、5的丑数指针,它们的初始值对应着dp[0],也就是三者共同的丑数1
2.我们的for循环dp数组是从1开始,也就是开始找第二小的丑数
String[] chou2 = {1 * 2 , 2 * 2 , 3 * 2 , 4 * 2, 5 * 2 , 6 * 2 ,…}
String[] chou3 = {1 * 3 , 2 * 3 , 3 * 3 , 4 * 3 , 5 * 3, 6 * 3 ,…}
String[] chou5 = {1 * 5 , 2 * 5 , 3 * 5, 4 * 5 , 5 * 5 , 6 * 4 ,…}
我上面给出丑数的三个数组,我们的目的就是需要在这三个丑数数组中,从小到大的找出第n个丑数返回,这样想就简单了,每次我们都找最小的丑数就可以,然后将属于2、3、5的哪个丑数的指针++去计算下一个元素,将其记录到dp数组中即可,最后返回dp[n-1]就是我们要的结果
还有不清楚的可以直接在评论区留言我们讨论讨论
完成时间:11:48