题目描述:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
常规思路:
丑数只能被2,3,5整除,所以碰到一个数,如果能被2整除,就一直整除2;如果能被3整除,就一直整除3;如果能被5整除,就一直整除5。如果最后得到1,说明该数是丑数,该思路的问题在于对于不是丑数的数也要去做判断,导致复杂度过大。
用空间换时间:
将前面得到的丑数放在一个数组,下一个丑数肯定是前面的丑数*2,*3,*5中的最小值,对于目前的M个丑数,对这M个丑数分别乘以2,肯定有一部分数是小于第M个丑数的,我要找到大于第M个丑数的最小的那个丑数,也就是定义一个指针P2,指向第一个元素,若第一个元素*2小于第M个丑数,则指针p2向后移,直到大于时才结束,对于p3,p5也是类似,然后再求a[p2]*2,a[p3]*3,a[p5]*5中的最小值作为第M+1个丑数。该方法创建一个数组,来利用已有的丑数来求出下一个丑数。
代码如下:
public class Solution { public int GetUglyNumber_Solution(int index) { if(index == 0) return 0; int count = 1; int[] a = new int[index]; a[0] = 1; int p2 = 0; int p3 = 0; int p5 = 0; int min = 0; while(count<index){ min = a[p2]*2>a[p3]*3?a[p3]*3:a[p2]*2; min = min<a[p5]*5?min:a[p5]*5; a[count] = min; while(a[p2]*2<=a[count]) p2++; while(a[p3]*3<=a[count]) p3++; while(a[p5]*5<=a[count]) p5++; count++; } return a[count-1]; } }