算法小知识-----10.14----- 丑数 II

69 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

终于终于周五了,家人们,全世界摸鱼

丑数 II

该题出自力扣的264题 —— 丑数II【中等题】

审题

给你一个整数 n ,请你找出并返回第 n 个 丑数 。 丑数 就是只包含质因数 23 和/或 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];
    }
}

image.png