算法系列——丑数II(Ugly Number II)

这篇博客探讨了LeetCode中的丑数II问题,介绍了如何找到第n个丑数。作者指出,直接遍历判断的方法会导致超时,于是提出使用动态规划的思路,通过维护三个列表l2、l3和l5来存储2、3、5的倍数,每次选取最小的节点作为当前丑数,并更新列表。博客提供了具体的实现细节和解题过程。
摘要由CSDN通过智能技术生成

题目描述

题目链接:https://leetcode-cn.com/problems/ugly-number-ii/
Write a program to find the n-th ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note that 1 is typically treated as an ugly number, and n does not exceed 1690.

解题思路

题目要求我们找到给定的第n个丑数。
最简单的想法是不断遍历每个正整数,判断它是不是丑数。一直统计,直到它达到n个。这种方法虽然直观,但是在leetcode OJ 上会报超时。

我们尝试新的思路。

(2) 1×2, 2×2, 3×2, 4×2, 5×2, …
(3) 1×3, 2×3, 3×3, 4×3, 5×3, …
(5) 1×5, 2×5, 3×5, 4×5, 5×5, …

一个新的丑数可以看做是一个旧的丑数乘以2,3,5得到的(第一个丑数是1,第二个为2,则第二个可以看做第一个丑数2得到了第二个丑数(12、13和15中的最小者)),本题解题难点在于维护丑数数列为从小到大排列的顺序。

根据上述思路可以做如下实现:

维护三个列表l2,l3,l5,分别是当前处理的丑数num的2,3,5倍,因此三个列表组内均是遵从从小到大排列的规则;
每次获得三个列表的第一个结点(最小的结点)最为当前丑数num,根据当前丑数值想三个列表末端插入新的较大的丑数值,等待后续处理;
若列表的第一个结点与当前丑数num相等,则删除列表第一个结点(表示该丑数已经被计数);
题目的初始条件为num = 1, count = 1;

程序实现

class Solution {
   
    public int nthUglyNumber
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值