剑指offer第33题(C#)
题目描述:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
这道题目刚拿到手我整个人是懵的(高数比较差),百度丑数之后才逐渐清晰起来,可以理解为是2,3,5的倍数因为丑数只有可能是这三个质因子;接下来我们再举例子看看
2的倍数:2,4,6,8,10…
3的倍数:3,6,9,12,15…
5的倍数:5,10,15…
大家可以看出来这些其实都是丑数而且是从小到大,但是我们仔细看能够发现有很多是重合的数字,如果我们只是单纯的将三个数乘起来再放起来是需要查重的,到这里我们大致的思路就可以梳理出来了,将三个数的倍数且查重后放到一个从小到大的数组里,最后输入索引下标返回我们需要的丑数,下面展示一些 内联代码片
。
// An highlighted block
using System;
class Solution
{
public int GetUglyNumber_Solution(int index)
{
// write code here
if(index<=0)
return 0;
int p2=0,p3=0,p5=0;//三个数的倍数肯定是需要做三个标记
int[] res = new int[index];//题目只需要第index个丑数所以我们找到这里就可以了
res[0] = 1;//从第一个丑数1开始
for(int i=1 ; i<index ; i++){
res[i] = Math.Min(res[p2]*2,Math.Min(res[p3]*3,res[p5]*5));
//因为要从小到大所以筛选出每次三个质数倍数中最小的那一个
if(res[i]==res[p2]*2)
p2++;
if(res[i]==res[p3]*3)
p3++;
if(res[i]==res[p5]*5)
p5++;
//这三句是查重语句当235中某个数的倍数与其他两个倍数相同时则直接省略其他两个数
//则直接省略其他两个数的那个倍数直接加一进入下一倍数的比较排序
}
return res[index-1];
}
}