丑数

题目描述:

把只包含因子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];
    }

}

猜你喜欢

转载自blog.csdn.net/caisongcheng_good/article/details/79925478