今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。

1 题目描述

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

2 思路----Py

顺序将每个丑数都放在数组里面,然后求解下一个丑数

  • 求解的丑数中,下一个丑数一定是由最小的丑数*2/3/5得来

  • 在数组中必定有一个丑数X2, 在它之前的数 * 2 都小于当前最大丑数, 在它之后的数 * 2都大于当前最大丑数, 同样有M3, M5

3 代码实现

c++版本

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
    //动态规划,对于第i个数,它一定是之前已存在数的2倍,3倍或5倍
        if(index <= 0)
            return 0;
        int* buf = new int[index];
        buf[0] = 1;
        int s1 = 0;
        int s2 = 0;
        int s3 = 0;
        for(int i = 1;i<index;++i){
            buf[i] = min(buf[s1]*2,min(buf[s2]*3,buf[s3]*5));
            if(buf[i] == buf[s1]*2) s1++;
            if(buf[i] == buf[s2]*3) s2++;
            if(buf[i] == buf[s3]*5) s3++;
        }
        return buf[index-1];
    }
};

java版本

import java.util.*;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<=0)return 0;
        ArrayList<Integer> list=new ArrayList<Integer>();
        list.add(1);
        int i2=0,i3=0,i5=0;
        while(list.size()<index)//循环的条件
        {
            int m2=list.get(i2)*2;
            int m3=list.get(i3)*3;
            int m5=list.get(i5)*5;
            int min=Math.min(m2,Math.min(m3,m5));
            list.add(min);
            if(min==m2)i2++;
            if(min==m3)i3++;
            if(min==m5)i5++;
        }
        return list.get(list.size()-1);
    }
}

python版本

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        if index < 1:
            return 0

        result = [1]
        # 初始化
        t2 = t3 = t5 = 0

        nextIdx = 1
        while nextIdx < index:
            #当前最小值
            minNum = min(result[t2] * 2, result[t3] * 3, result[t5] * 5)
            result.append(minNum)

            while result[t2] * 2 <= minNum:
                t2 += 1
            while result[t3] * 3 <= minNum:
                t3 += 1
            while result[t5] * 5 <= minNum:
                t5 += 1

            nextIdx += 1

        return result[nextIdx - 1]

4 唠嗑

2020年7月21日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。