###### tags: `Leetcode` `medium` `pointer` `array` `python` `c++`
# 264. Ugly Number II
## [題目連結:] https://leetcode.com/problems/ugly-number-ii/description/
## 題目:
An **ugly number** is a positive integer whose prime factors are limited to ```2```, ```3```, and ```5```.
Given an integer ```n```, return the ```nth``` **ugly number**.
**Example 1:**
```
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.
```
**Example 2:**
```
Input: n = 1
Output: 1
Explanation: 1 has no prime factors, therefore all of its prime factors are limited to 2, 3, and 5.
```
## 解題想法:
* 此題為求第n個ugly number:
* 其因數只能為2,3,5構成
* 指針判斷:
* 初始nums=[1]
* 用3個pointer維護,初始都指向位置0
* 乘2
* 乘3
* 乘5
* 每次比較取最小的加入nums,並將該pointer+1
* 要分別判斷當前最小等於乘2、乘3、乘5
* 不能用if elif、else...
* 因為可能碰到公倍數
* ex: 6,則pointer2、pointer3皆須+1
## Python:
``` python=
class Solution(object):
def nthUglyNumber(self, n):
"""
:type n: int
:rtype: int
"""
#用3個pointer維護*2*3*5 取最小的加入list 並將該pointer+1
nums=[1]
#初始都指向位置0
p2=0
p3=0
p5=0
for val in range(n-1):
tmp=min(nums[p2]*2,nums[p3]*3,nums[p5]*5)
nums.append(tmp)
#要分別判斷 不能if elif else...連續
#因為可能碰到公倍數
if tmp==nums[p2]*2:
p2+=1
if tmp==nums[p3]*3:
p3+=1
if tmp==nums[p5]*5:
p5+=1
return nums[-1]
result=Solution()
ans=result.nthUglyNumber(n=10)
print(ans)
```
## C++:
``` cpp=
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> res(1,1);
int p2=0, p3=0, p5=0;
int val=0;
for (int i=0; i<n-1; i++){
val=min(min(res[p2]*2, res[p3]*3), res[p5]*5);
res.push_back(val);
if (val==res[p2]*2)
p2+=1;
if (val==res[p3]*3)
p3+=1;
if (val==res[p5]*5)
p5+=1;
}
return res.back();
}
};
```