LeetCode263. Ugly Number

版权声明:本文为博主原创文章,欢迎转载!转载请保留原博客地址。 https://blog.csdn.net/grllery/article/details/89058441

Ugly Number

263. 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.

Example 1:

Input: 6
Output: true
Explanation: 6 = 2 × 3

Example 2:

Input: 8
Output: true
Explanation: 8 = 2 × 2 × 2

Example 3:

Input: 14
Output: false
Explanation: 14 is not ugly since it includes another prime factor 7.

Note:

  • 1 is typically treated as an ugly number.
  • Input is within the 32-bit signed integer range: [−2^31, 2^31 − 1].

题目:判断输入的数是否为丑数。

思路:分别对2,3,5进行取余判断,如果取余为0,则将num除以对应的数,判断最后剩下的值是否为1

工程代码下载

class Solution {
public:
    bool isUgly(int num) {
        if(num <= 0) return false;
        for(int i = 2; i <=5; ++i){
            while(num % i == 0){
                num /= i;
            }
        }
        return num == 1;
    }
};

264. 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.

Example:

Input: n = 10
Output: 12
Explanation: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note:

  • 1 is typically treated as an ugly number.
  • n does not exceed 1690.

题目:第n个丑数。

思路:参见C++ DP solution with short explanation.

We have an array k of first n ugly number. We only know, at the beginning, the first one, which is 1. Then

k[1] = min( k[0]x2, k[0]x3, k[0]x5). The answer is k[0]x2. So we move 2’s pointer to 1. Then we test:

k[2] = min( k[1]x2, k[0]x3, k[0]x5). And so on. Be careful about the cases such as 6, in which we need to forward both pointers of 2 and 3.

x here is multiplication.

class Solution {
public:
    int nthUglyNumber(int n) {
        if(n <= 0) return 0;
        if(n == 1) return 1;
        vector<int> k(n);
        k[0] = 1;
        int t2 = 0, t3 = 0, t5 = 0;
        for(int i = 1; i < n; ++i){
            k[i] = min(2*k[t2], min(3*k[t3], 5*k[t5]));
            if(2*k[t2] == k[i]) ++t2;
            if(3*k[t3] == k[i]) ++t3;
            if(5*k[t5] == k[i]) ++t5;
        }
        return k[n-1];
    }
};

猜你喜欢

转载自blog.csdn.net/grllery/article/details/89058441
今日推荐