263.ugly-number.md 3.5 KB
Newer Older
Y
yulecc 已提交
1
## 题目地址(263. 丑数)
L
luzhipeng 已提交
2

Y
yulecc 已提交
3
https://leetcode-cn.com/problems/ugly-number/
L
luzhipeng 已提交
4 5 6 7

## 题目描述

```
Y
yulecc 已提交
8
编写一个程序判断给定的数是否为丑数。
L
luzhipeng 已提交
9

Y
yulecc 已提交
10
丑数就是只包含质因数 2, 3, 5 的正整数。
L
luzhipeng 已提交
11

Y
yulecc 已提交
12
示例 1:
L
luzhipeng 已提交
13

Y
yulecc 已提交
14 15 16 17
输入: 6
输出: true
解释: 6 = 2 × 3
示例 2:
L
luzhipeng 已提交
18

Y
yulecc 已提交
19 20 21 22
输入: 8
输出: true
解释: 8 = 2 × 2 × 2
示例 3:
L
luzhipeng 已提交
23

Y
yulecc 已提交
24
输入: 14
L
lucifer 已提交
25
输出: false
Y
yulecc 已提交
26 27
解释: 14 不是丑数,因为它包含了另外一个质因数 7。
说明:
L
luzhipeng 已提交
28

Y
yulecc 已提交
29 30
1 是丑数。
输入不会超过 32 位有符号整数的范围: [−231,  231 − 1]。
L
luzhipeng 已提交
31 32 33

```

L
lspeer 已提交
34 35
## 前置知识

L
lucifer 已提交
36
- 数学
L
lspeer 已提交
37
- 因数分解
L
lucifer 已提交
38

39 40 41 42 43 44 45
## 公司

- 阿里
- 腾讯
- 百度
- 字节

L
luzhipeng 已提交
46 47
## 思路

L
lucifer 已提交
48
题目要求给定一个数字,判断是否为“丑陋数”(ugly number), 丑陋数是指只包含质因子 2, 3, 5 的正整数。
L
luzhipeng 已提交
49

L
lucifer 已提交
50
![263.ugly-number](https://tva1.sinaimg.cn/large/007S8ZIlly1ghltxf68kej30hh09fdgd.jpg)
L
luzhipeng 已提交
51

L
lucifer 已提交
52 53
根据定义,我们将给定数字除以 2、3、5(顺序无所谓),直到无法整除。
如果得到 1,说明是所有因子都是 2 或 3 或 5,如果不是 1,则不是丑陋数。
L
luzhipeng 已提交
54

L
lucifer 已提交
55 56
这就好像我们判断一个数字是否为 n(n 为大于 1 的正整数)的幂次方一样,我们只需要
不断除以 n,直到无法整除,如果得到 1,那么就是 n 的幂次方。 这道题的不同在于
L
luzhipeng 已提交
57 58 59 60 61
它不再是某一个数字的幂次方,而是三个数字(2,3,5),不过解题思路还是一样的。

转化为代码可以是:

```js
L
lucifer 已提交
62 63 64
while (num % 2 === 0) num = num / 2;
while (num % 3 === 0) num = num / 3;
while (num % 5 === 0) num = num / 5;
L
luzhipeng 已提交
65

L
lucifer 已提交
66
return num === 1;
L
luzhipeng 已提交
67 68 69 70 71
```

> 我下方给出的代码是用了递归实现,只是给大家看下不同的写法而已。

## 关键点
L
lucifer 已提交
72

L
luzhipeng 已提交
73 74
- 数论
- 因数分解
75

L
luzhipeng 已提交
76 77
## 代码

L
lucifer 已提交
78
- 语言支持:JS, C++, Java, Python
79 80

Javascript Code:
L
luzhipeng 已提交
81

82
```js
L
luzhipeng 已提交
83 84 85 86 87 88 89 90 91
/*
 * @lc app=leetcode id=263 lang=javascript
 *
 * [263] Ugly Number
 */
/**
 * @param {number} num
 * @return {boolean}
 */
L
lucifer 已提交
92
var isUgly = function (num) {
L
luzhipeng 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
  // TAG: 数论
  if (num <= 0) return false;
  if (num === 1) return true;

  const list = [2, 3, 5];

  if (list.includes(num)) return true;

  for (let i of list) {
    if (num % i === 0) return isUgly(Math.floor(num / i));
  }
  return false;
};
```

L
lucifer 已提交
108
**复杂度分析**
L
lucifer 已提交
109 110 111

- 时间复杂度:$O(logN)$
- 空间复杂度:$O(logN)$
L
lucifer 已提交
112

z2014z's avatar
z2014z 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
C++ Code:

```c++
class Solution {
public:
    bool isUgly(int num) {
        int ugly[] = {2,3,5};
        for(int u : ugly)
        {
            while(num%u==0 && num%u < num)
            {
                num/=u;
            }
        }
        return num == 1;
    }
};
```

Java Code:

```java
class Solution {
    public boolean isUgly(int num) {
        int [] ugly = {2,3,5};
        for(int u : ugly)
        {
            while(num%u==0 && num%u < num)
            {
                num/=u;
            }
        }
        return num == 1;
    }
}
```

150 151 152 153 154 155 156 157 158 159 160 161 162
Python Code:

```python
# 非递归写法
class Solution:
    def isUgly(self, num: int) -> bool:
        if num <= 0:
            return False
        for i in (2, 3, 5):
            while num % i == 0:
                num /= i
        return num == 1
```
L
lucifer 已提交
163

L
lucifer 已提交
164 165
**复杂度分析**

L
lucifer 已提交
166 167
- 时间复杂度:$O(logN)$
- 空间复杂度:$O(1)$
L
lucifer 已提交
168

L
lucifer 已提交
169
更多题解可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。
L
lucifer 已提交
170

L
lucifer 已提交
171
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
L
lucifer 已提交
172 173

![](https://tva1.sinaimg.cn/large/007S8ZIlly1gfcuzagjalj30p00dwabs.jpg)