zoukankan      html  css  js  c++  java
  • 【LeetCode & 剑指offer刷题】特殊数题4:263 Ugly Number(系列)

    【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

    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. 1 is typically treated as an ugly number.
    2. Input is within the 32-bit signed integer range: [−231,  231 − 1].
     
    class Solution
    {
    public:
        bool 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);
        }
    };
     
     
    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. 1 is typically treated as an ugly number.
    2. n does not exceed 1690.
     
    思路: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.
    /*
    如:
    k[0] = 1, 1*2 1*3 1*5
    k[1] = 2, 2*2 1*3 1*5
    k[2] = 3, 2*2 2*3 1*5
    */
    #include <algorithm>
    class Solution
    {
    public:
        int nthUglyNumber(int n)
        {
            if(n <= 0) return 0; //表示不存在
           
            vector<int> k(n); //用于存各丑数
            k[0] = 1;
            int p2 = 0, p3 = 0, p5 = 0; //对需要乘因子2,3,5的数的指针 
            for(int i = 1; i<n; i++) //i = 1~n-1
            {
                k[i] = min(k[p2]*2, min(k[p3]*3, k[p5]*5));
                if(k[i] == k[p2]*2) p2++; //只要相等就要移动,如6,需同时移动2和3的指针
                if(k[i] == k[p3]*3) p3++;
                if(k[i] == k[p5]*5) p5++;
            }
            return k[n-1];
        }
    };
     
    313. 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.
    Example:
    Input: n = 12, primes = [2,7,13,19]Output: 32
    Explanation: [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 is a super ugly number for any given primes.
    • The given numbers in primes are in ascending order.
    • 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.
    • The nth super ugly number is guaranteed to fit in a 32-bit signed integer.
     
    //类似ugly number II
    #include <climits>
    class Solution
    {
    public:
        int nthSuperUglyNumber(int n, vector<int>& primes)
        {
            if(n <= 0) return 0; //表示不存在丑数
            int k = primes.size();
            vector<int> index(k, 0); //用于指向要乘某因子的丑数,初始化为0
            vector<int> ugly(n);
            ugly[0] = 1;
            for(int i = 1; i<n; i++) //i=1~n-1
            {
                int temp = INT_MAX; //初始化为最大数,初始化为ugly[index[0]] * primes[0]较好
                for(int j = 0; j<k; j++) temp = min(temp, ugly[index[j]] * primes[j]);
                for(int j = 0; j<k; j++) //如果选取的是之前某个丑数乘某因子作为下个丑数,则该因子指针移动到下一个位置(否则下次乘出来还是最小的)
                {
                    if(temp == ugly[index[j]] * primes[j]) index[j]++;
                }
                ugly[i] = temp;
            }
            return ugly[n-1];
        }
    };
     
     
     
  • 相关阅读:
    数据库的范式
    数据库的事务
    cookie和session以及区别
    Java交换排序:冒泡排序和快速排序
    Java面向对象中:方法重载和方法重写以及区别、 this关键字和super关键字以及区别
    电子设备产品可靠性测试
    软件测试思考笔记(The beauty of software testing)
    常见软件系统架构解决方案
    常见计算机系统架构
    性能测试
  • 原文地址:https://www.cnblogs.com/wikiwen/p/10225080.html
Copyright © 2011-2022 走看看