剑指offer: 丑数

题目描述:

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

思路:

        1是第一个丑数,后面的丑数都是前面的丑数分别与 2 ,3, 5相乘的结果。把这些丑数从小到大排列放在数组里面,最后只需要返回数组的最后一个元素就可以了。

        具体的排列: a表示存放丑数的数组,a[0] = 1,m2,m3,m5分别代表2,3,5的倍数所在的位置。刚开始都为0。循环的条件是i<index , i 从1开始,index-1代表第n个丑数的位置,也就是数组的长度。每次将a[m2]*2, a[m3]*3, a[m5]*5中最小的值放在数组中,如果当前a[m2]*2最小,则m2++,依次类推,这样,每次比较后的最小的值所在的m递增。

对于index=5,


m2,m3, m5分别与2,3,5相乘,比较大小

代码实现:

 public static int GetUglyNumber_Solution(int index) {
    	if(index <= 0){
    		return 0;
    	}
//    	1为第一个丑数
    	int[] a = new int[index];
    	a[0] = 1;
    	int m2 ,m3 ,m5 ,i;
    	m2 = m3 = m5 = 0;
    	i = 1;  
    	while(i<index){
//    		将三者中的最小值给当前的a[i]
    		a[i] = min(a[m2]*2, a[m3]*3, a[m5]*5);
    		if(a[m2]*2 <= a[i]){
    			m2++;
    		}
    		if(a[m3]*3 <= a[i]){
    			m3++;
    		}
    		if(a[m5]*5 <= a[i]){
    			m5++;
    		}
    		i++;
    	}
    			
    	return a[index-1];
	}
 //求最小值
	public static int min(int a, int b, int c) {
		int min = (a < b) ? a : b;
		return (min < c) ? min : c;
	} 

猜你喜欢

转载自blog.csdn.net/weixin_38108266/article/details/80958687