[剑指Offer]49-丑数
题目
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
题解
- 把丑数按顺序依次算好放在数组中,
uglyNum[nextUglyIdx]=Min(uglyNum[multi2Idx]*2,uglyNum[multi3Idx]*3,uglyNum[multi5Idx]*5);
; - 此外更新当前的三个指针multi2Idx、multi3Idx、multi5Idx,其中,例如multi2Idx对应得丑数*2将得到第一个大于当前丑数数组最大值的数。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int index=s.nextInt();
System.out.println(GetUglyNumber_Solution(index));
}
public static int GetUglyNumber_Solution(int index) {
if(index<=0) {
return 0;
}
int[] uglyNum=new int[index];
uglyNum[0]=1;
int nextUglyIdx=1;
int multi2Idx=0;
int multi3Idx=0;
int multi5Idx=0;
while(nextUglyIdx<index) {
uglyNum[nextUglyIdx]=Min(uglyNum[multi2Idx]*2,uglyNum[multi3Idx]*3,uglyNum[multi5Idx]*5);
while(uglyNum[multi2Idx]*2<=uglyNum[nextUglyIdx]) {
++multi2Idx;
}
while(uglyNum[multi3Idx]*3<=uglyNum[nextUglyIdx]) {
++multi3Idx;
}
while(uglyNum[multi5Idx]*5<=uglyNum[nextUglyIdx]) {
++multi5Idx;
}
++nextUglyIdx;
}
return uglyNum[index-1];
}
public static int Min(int... nums) {
int min=Integer.MAX_VALUE;
for(int num:nums) {
min=min<num?min:num;
}
return min;
}
}
posted on 2019-07-07 22:14 coding_gaga 阅读(147) 评论(0) 编辑 收藏 举报