持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
终于终于周五了,家人们,全世界摸鱼
丑数 II
该题出自力扣的264题 —— 丑数II【中等题】
审题
给你一个整数
n,请你找出并返回第n个 丑数 。 丑数 就是只包含质因数2、3和/或5的正整数。
- 这道题,总感觉有点类似之前做过的题目,但是追查记录,又确实是没有做过
- 题意并不复杂,就是需要理解质因数,质因数就是一个数的约数,并且是质数。那么这边给出的条件就是需要是2或者3或者5的质因数。题目需要返回给出指定第n个的数
- 既然需要返回指定位置的数,那么就需要对数组进行存储。需要从1开始整理数据,直到第n个
- 那么这道题的核心就在于构造丑数的数组,首先构造出一个数组,长度为给定的n,再将数组填充每个值为Integer的最大值
- 利用3个指针变量,分别指向2/3/5,这里的核心就在于,有资格同i相乘的最小丑数的位置。这里资格指的是:如果一个变量指针下对应的数组下标值与对应的质因数相乘,为三者的最小值,那么这个值就成为下一位丑数,而这个下标变量就需要加一,指向下一个丑数,不再有机会参与当前下标的丑数
- 每次我们都分别比较有资格同2,3,5相乘的最小丑数,选择最小的那个作为下一个丑数
编码
class Solution {
public int nthUglyNumber(int n) {
int[] dp = new int[n];
Arrays.fill(dp,Integer.MAX_VALUE);
int p1 = 0,p2=0,p3 = 0;
dp[0] = 1;
for (int i = 1; i < n; i++) {
int min = Math.min(dp[p1] * 2,Math.min(dp[p2] * 3,dp[p3] * 5));
dp[i] = min;
if (min % 2 == 0)p1++;
if (min % 3 == 0)p2++;
if (min % 5 == 0)p3++;
}
return dp[n -1];
}
}