丑数~

186 阅读1分钟
  • 要求 : 把只包含因子2,3,5的数称为丑数。输出从小到大排序的第n个丑数。
  • 说明:
  1. 1是丑数,是第一个丑数
  2. 输入10,输出12,因为有[1,2,3,4,5,6,8,9,10,12]
  • 思路:
  1. 丑数=某个丑数×某个因子
  2. 丑数按从小到大的顺序排列,所以需要比较大小来决定是哪个丑数乘了某个因子
  3. 初始时,都指向1,分别比较 *2,*3,*5的大小关系,选择其中一个最小值,选中之后,该因子对应的起始位置就往后移一个。nums[0]变成了nums[1]这样。
  4. 其实可以理解为将一个数组分为三个部分组成,然后合并三个数组,相同的部分抵消,且按从小到大的顺序排列。
class Solution {
    public int nthUglyNumber(int n) {
        if (n < 0) return 0;
        if (n < 6) return n;
        int p1 = 0, p2 = 0, p3 = 0;
        int[] nums = new int[n];
        nums[0] = 1;
        for (int i = 1; i < n; i++) {
            nums[i] = Math.min((nums[p1]*2), Math.min(nums[p2]*3, nums[p3]*5));
            if (nums[i] == nums[p1]*2) p1++;
            if (nums[i] == nums[p2]*3) p2++;
            if (nums[i] == nums[p3]*5) p3++;
        }
        return nums[n-1];
    }
}