算法分析與設計課程(19):【leetcode】Ugly Number II

Description:

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, and n does not exceed 1690.

Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

算法分析:

這道題是之前那道Ugly Number 醜陋數的延伸,這裏讓我們找到第n個醜陋數,還好題目中給了很多提示,基本上相當於告訴我們解法了,根據提示中的信息,我們知道醜陋數序列可以拆分爲下面3個子列表:

(1) 1×2, 2×2, 3×2, 4×2, 5×2, …
(2) 1×3, 2×3, 3×3, 4×3, 5×3, …
(3) 1×5, 2×5, 3×5, 4×5, 5×5, …

仔細觀察上述三個列表,我們可以發現每個子列表都是一個醜陋數分別乘以2,3,5,而要求的醜陋數就是從已經生成的序列中取出來的,我們每次都從三個列表中取出當前最小的那個加入序列。

代碼如下:

class Solution {
public:
    int nthUglyNumber(int n) {
        vector<int> res(1, 1);
        int i2 = 0, i3 = 0, i5 = 0;
        while (res.size() < n) {
            int m2 = res[i2] * 2, m3 = res[i3] * 3, m5 = res[i5] * 5;
            int mn = min(m2, min(m3, m5));
            if (mn == m2) ++i2;
            if (mn == m3) ++i3;
            if (mn == m5) ++i5;
            res.push_back(mn);
        }
        return res.back();
    }
};





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章