剑指offer49 丑数

首先想到暴力解法,从1开始遍历所有数,判断其是否是丑数,直到找到第目标个丑数。

思路二用空间换时间,看了剑指offer才想出来:

即用丑数产生丑数。具体思路稍显复杂,看剑指offer吧。

代码:

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<1) return 0;
        if(index==1) return 1;
        
        int[] ugly = new int[index];
        ugly[0]=1;
        int m2 = 0;//每轮从ugly[m2]开始乘获取新丑数即可
        int m3 = 0;
        int m5 = 0;
        
        int current = 1;
        while(current<index){
            ugly[current] = myMin(ugly[m2]*2,ugly[m3]*3,ugly[m5]*5);
            while(ugly[m2]*2<=ugly[current]) m2++;
            while(ugly[m3]*3<=ugly[current]) m3++;
            while(ugly[m5]*5<=ugly[current]) m5++;
            current++;
        }
        return ugly[index-1];
    }
    private int myMin(int m2,int m3,int m5){
        int min = m2;
        if(m3<min) min = m3;
        if(m5<min) min = m5;
        return min;
    }
}

运行时间:21ms

占用内存:9464k

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        uglys = [1]
        if index<1:
            return 0
        m2=m3=m5=0
        while index>len(uglys):
            uglys.append(min(uglys[m2]*2,uglys[m3]*3,uglys[m5]*5))
            while uglys[m2]*2<=uglys[-1]:
                m2+=1
            while uglys[m3]*3<=uglys[-1]:
                m3+=1
            while uglys[m5]*5<=uglys[-1]:
                m5+=1
        return uglys[-1]

运行时间:26ms

占用内存:5728k

posted @ 2019-02-28 18:04  大胖子球花  阅读(83)  评论(0)    收藏  举报