leetcode - Ugly Number、Ugly Number II 、Super Ugly Number

来源:互联网 发布:js跨frame调用方法 编辑:程序博客网 时间:2024/04/29 18:05

leetcode题目汇集 — Ugly Number系列

首先看一下这几道题目要求

Ugly Number

Write a program to check whether a given number is an ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 6, 8 are ugly while 14 is not ugly since it includes another prime factor 7.

Note that 1 is typically treated as an ugly number.


Ugly Number II

Write a program to find the n-th ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note that 1 is typically treated as an ugly number.


Super Ugly Number

Write a program to find the nth super ugly number.

Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4.

Note:
(1) 1 is a super ugly number for any given primes.
(2) The given numbers in primes are in ascending order.
(3) 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.

第一道题定义了ugly number:质因数只包含2,3,5的数字,其中1是特殊的ugly number

按照质因数分解方法,依次除以质因数2,3,5,判断最后的结果是否为1.

代码:

public class Solution {    public boolean isUgly(int num) {        if (num <= 0) {            return false;        }        while (num % 2 == 0) {            num /= 2;        }        while (num % 3 == 0) {            num /= 3;        }         while (num % 5 == 0) {            num /= 5;        }        return num == 1 ? true : false;    }}


第二道题 Ugly Number II在题目1的基础上求出第n个ugly number

最简单粗暴的方法就是依次遍历各整数,直到ugly number个数等于n的时候停止,这种方法比较复杂。

另一种方法就是提示部分的方法:维护三个计数器i2,i3,i5,分别指向uglys中通过乘以2,3,5得到结果的下标,并将本次uglys[i2]*2,uglys[i3]*3,uglys[i5]*5的最小值加入uglys,对应的计数器加1.

代码

public class Solution {    public int nthUglyNumber(int n) {        List<Integer> uglys = new LinkedList<Integer>();        uglys.add(1);        int i2 = 0, i3 = 0, i5 = 0;        while (uglys.size() < n) {            int minValue = Math.min(uglys.get(i2) * 2, Math.min(uglys.get(i3) * 3, uglys.get(i5) * 5));            if (minValue == uglys.get(i2) * 2) {                i2++;            }            if (minValue == uglys.get(i3) * 3) {                i3++;            }            if (minValue == uglys.get(i5) * 5) {                i5++;            }            uglys.add(minValue);        }        return uglys.get(n - 1);            }}


第三道题 Super Ugly Number是Ugly Number ||的延伸,这里的ugly number其质因数只包含primes中的元素,其中1是特殊的ugly number

借鉴第二道题的思想,假设primes数组大小为k,则维护一个大小为k的计数器数组,方法与第二道题类似。

代码:

public class Solution {  public int nthSuperUglyNumber(int n, int[] primes) {    int k = primes.length;    int[] count = new int[k];    int[] temp = new int[k];    int[] nums = new int[n];    nums[0] = 1;    for (int j = 1; j < n; j++) {      for (int i = 0; i < k; i++) {        temp[i] = nums[count[i]] * primes[i];      }      int min = temp[0];      for (int i = 1; i < k; i++) {        if (temp[i] < min) {          min = temp[i];        }      }      for (int i = 0; i < k; i++) {        if (temp[i] == min) {          count[i]++;        }      }      nums[j] = min;    }    return nums[n - 1];  }}




0 0
原创粉丝点击