把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
链接:剑指offer49 丑数
/*思路:
1.每次找出一个最小丑数res[i],都会产生三个新的丑数,2*res[i],3*res[i],5*res[i];
2.如果我们每次都把新的丑数和旧的丑数放在一起找出最小值,时间复杂度将会很大。实际上我们只需要在这些数中拿三个数出来进行比较.
这三个数分别是next2 = 2*res[i2] , next3 = 3*res[i3] , next5 = 5*res[i5]。他们代表的是 2,3,5乘以他们对应的最小
丑数。因为在所有2*res[i]的丑数中2*res[i2]是最小的,相应的另外两个数也是同样的道理,所以只需在这三个数中找出最小的,那就
是所有丑数中最小的。
*/
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index == 0){
return 0;
}
int[] res = new int[index];
int i2 = 0 , i3 = 0, i5 = 0;
res[0] = 1;
for(int i = 1; i<index;i++){
int next2 = 2*res[i2] , next3 = 3*res[i3] , next5 = 5*res[i5]; //维护三个指针指向头部
int min = Math.min(next2,Math.min(next3,next5));
res[i] = min;
if(min == next2)
i2++;
if(min == next3)
i3++;
if(min == next5)
i5++;
}
return res[index-1];
}
}