题解 | #丑数#

丑数

http://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b

题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

方法一:暴力求解

求解思路
对于求解丑数,因为题目要求丑数的质因子只能为2,3,5.根据整数可以唯一被质数表示可知,我们采用枚举的方法,直接将图片说明 中的i,j,k直接循环即可。最后再将得到的数组进行排序,即可求出最后的答案。

图片说明

解题代码

class Solution {
public:
    int p[11111111];//存储枚举数组的结果,可以随便设置一个比较大的长度。
    int GetUglyNumber_Solution(int index) {
    p[1]=1;
    int x=2;
    for(int i=0;i<=50;i++)
    {
        for(int j=0;j<=50;j++)
        {
            for(int k=0;k<=50;k++)
            {
                if (i==0 && j==0 && k==0) continue;
                int t=pow(2,i)*pow(3,j)*pow(5,k);
                if (t<0)continue;
                p[x++]=t;
            }
        }
    }
    sort(p,p+x);//对求出的所有丑数进行排序,最后输出结果即可。
    return p[index];
    }
};

复杂度分析
时间复杂度:三个for循环,O(图片说明 )
空间复杂度:一个常数级数组来存储丑数,因此空间复杂度为O(1)

方法二:最小堆的思想、参考复旦大学呼口周哼的解法

求解思路
一开始将1放入最小堆,然后取出堆顶元素(1)分别乘2,3,5.并且新的数字入堆,并且在入堆的过程中将重复的数字去除,最后将堆构建好,按题目要求取出第n个元素即可。

图片说明

解题代码

import heapq
class Solution:
    def GetUglyNumber_Solution(self, index):
        if index <= 0:
            return 0
        myf = [2,3,5]
        heap = [1]
        check = [1]

        for i in range(index - 1):
            cur = heapq.heappop(heap)
            for f in myf:
                n = cur * f
                if n not in check:
                    check.append(n)
                    heapq.heappush(heap, n)
        return heapq.heappop(heap)

复杂度分析
时间复杂度:堆排序时间,O(nlogn)
空间复杂度:因为构建堆花费了额外的内存空间,因此复杂度为O(n)

算法 文章被收录于专栏

算法题的题解以及感受

全部评论

相关推荐

11-11 16:40
已编辑
门头沟学院 人工智能
不知道怎么取名字_:这个有点不合理了,相当于已经毕业了,但还是没转正,这不就是白嫖
点赞 评论 收藏
分享
10-21 00:37
已编辑
门头沟学院 C++
小浪_Coding:你问别人,本来就是有求于人,别人肯定没有义务免费回答你丫, 有点流量每天私信可能都十几,几十条的,大家都有工作和自己的事情, 付费也是正常的, 就像你请别人搭把手, 总得给人家买瓶水喝吧
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务