[剑指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编辑  收藏  举报

导航