1201-丑数 III

Raphael Liu Lv10

给你四个整数:nabc ,请你设计一个算法来找出第 n 个丑数。

丑数是可以被 a b c 整除的 正整数

示例 1:

**输入:** n = 3, a = 2, b = 3, c = 5
**输出:** 4
**解释:** 丑数序列为 2, 3, 4, 5, 6, 8, 9, 10... 其中第 3 个是 4。

示例 2:

**输入:** n = 4, a = 2, b = 3, c = 4
**输出:** 6
**解释:** 丑数序列为 2, 3, 4, 6, 8, 9, 10, 12... 其中第 4 个是 6。

示例 3:

**输入:** n = 5, a = 2, b = 11, c = 13
**输出:** 10
**解释:** 丑数序列为 2, 4, 6, 8, 10, 11, 12, 13... 其中第 5 个是 10。

示例 4:

**输入:** n = 1000000000, a = 2, b = 217983653, c = 336916467
**输出:** 1999999984

提示:

  • 1 <= n, a, b, c <= 10^9
  • 1 <= a * b * c <= 10^18
  • 本题结果在 [1, 2 * 10^9] 的范围内

Problem: 1201. 丑数 III

[TOC]

思路

讲述看到这一题的思路

解题方法

描述你的解题方法

复杂度

  • 时间复杂度:

    添加时间复杂度, 示例: O(n)

  • 空间复杂度:

    添加空间复杂度, 示例: O(n)

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

public class Solution {
public int NthUglyNumber(int n, int a, int b, int c) {
long lcm_ab = Lcm(a, b), lcm_ac = Lcm(a, c), lcm_bc = Lcm(b, c), lcm_abc = Lcm(lcm_ab,c);
long l = 1, r = 2000000010;
while (l < r)
{
long mid = l + (r - l) / 2;
long k = mid / a + mid / b + mid / c - mid / lcm_ab - mid / lcm_ac - mid / lcm_bc + mid / lcm_abc;
if (k >= n) r = mid;
else l = mid + 1;
}

long gcd(long aa, long bb)
{
return bb > 0 ? gcd(bb, aa % bb) : aa;
}

long Lcm(long aa, long bb)
{
return aa / gcd(aa, bb) * bb;
}




return (int)l;
}
}
 Comments
On this page
1201-丑数 III