【LeetCode】丑数 IIJava题解|刷题打卡

299 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

题目

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

 

示例 1:

输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

提示:

1 <= n <= 1690

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/ug…

思路分析

  • 这个题目题意好理解,但是写出简洁清晰代码比较难。各位可以自己尝试写一下。理清思路,找个每个最小的丑数,完成排序。

代码

public class DayCode {
    public static void main(String[] args) {
        int num = 6;
        int ans = new DayCode().nthUglyNumber(num);
        System.out.println("ans is " + ans);
    }

    /**
     * 时间复杂度 O(n)
     * 空间复杂度 O(1)
     * @param n
     * @return
     */
    public int nthUglyNumber(int n) {
        int size = 1690;
        int[] nums = new int[size];
        nums[0] = 1;
        int ugly = 0, i2 = 0, i3 = 0, i5 = 0;
        for (int i = 1; i < size; i++ ) {
            ugly = Math.min(Math.min(nums[i2] * 2, nums[i3] * 3), nums[i5] * 5);
            nums[i] = ugly;
            if (ugly == nums[i2] * 2) {
                i2++;
            }
            if (ugly == nums[i3] * 3) {
                i3++;
            }
            if (ugly == nums[i5] * 5) {
                i5++;
            }
        }

        return nums[n-1];
    }
}

总结

  • 今天的每日一题,和昨天的丑数形成呼应,比昨天的复杂一点,实践五毒神掌!这里的n = 1690条件很重要,我们可以直接用来初始化数组。
  • 坚持每日一题,加油!