丑数
问题描述:我们只把包含因子2、3和5的数称为丑数。求按从小到大的顺序的第1500个丑数。
分析:要找到第i个丑数,需要用辅助数组存储前面i-1个丑数,用空间换取时间。
package com.wyl;
/**
* 求丑数
* 问题描述:我们只把包含因子2、3和5的数称为丑数。求按从小到大的顺序的第1500个丑数。
* @author wyl
*
*/
public class UglyNumber {
/**
* 得到第number个丑数
* @param number
* @return
*/
public int getUglyNumber(int number){
int[] uglyNumbers = new int[number]; //用来存储丑数
uglyNumbers[0] = 1; //第一个丑数为1
int nextUglyIndex = 1; //控制给uglyNumbers数组存储丑数的下标
int uglyNumber2 = 0; //记录乘以2的指针
int uglyNumber3 = 0; //记录乘以3的指针
int uglyNumber5 = 0; //记录乘以5的指针
while(nextUglyIndex < number){
//要存储的丑数必须是uglyNumber2*2、uglyNumber3*3和uglyNumber5*5中最小的数,
//并且更新uglyNumber2、uglyNumber3和uglyNumber5的指针,
//保证存在某个丑数使得要存储的丑数左边的丑数*2都比它 小,右边的*2都比它大
//保证存在某个丑数要存储的丑数左边的丑数*3都比它 小,右边的*3都比它大
//保证存在某个丑数要存储的丑数左边的丑数*5都比它 小,右边的*5都比它大
int min = Min(uglyNumbers[uglyNumber2] * 2, uglyNumbers[uglyNumber3] * 3, uglyNumbers[uglyNumber5] * 5);
uglyNumbers[nextUglyIndex] = min;
while(uglyNumbers[uglyNumber2] * 2 <= uglyNumbers[nextUglyIndex]){
++uglyNumber2; //移动乘2的指针
}
while(uglyNumbers[uglyNumber3] * 3 <= uglyNumbers[nextUglyIndex]){
++uglyNumber3; //移动乘3的指针
}
while(uglyNumbers[uglyNumber5] * 5 <= uglyNumbers[nextUglyIndex]){
++uglyNumber5; //移动乘5的指针
}
++nextUglyIndex;
}
return uglyNumbers[number-1];
}
//求三个整数中的最小值
private int Min(int i, int j, int k) {
// TODO Auto-generated method stub
int min = i<j?i:j;
min = (min < k)?min:k;
return min;
}
public static void main(String[] args) {
UglyNumber uglyNumber = new UglyNumber();
int uNumber = uglyNumber.getUglyNumber(10);
System.out.println("第1500个丑数为:" + uNumber);
}
}