今天开始讲和大家坚持打卡面试非常重要算法练习---剑指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找到理想的工作。如果你想加入,加我拉你进面试交流群。