LeetCode 1201. Ugly Number III Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1201. Ugly Number III

Description

An ugly number is a positive integer that is divisible by a, b, or c.

Given four integers n, a, b, and c, return the nth ugly number.

 

Example 1:

Input: n = 3, a = 2, b = 3, c = 5
Output: 4
Explanation: The ugly numbers are 2, 3, 4, 5, 6, 8, 9, 10... The 3rd is 4.

Example 2:

Input: n = 4, a = 2, b = 3, c = 4
Output: 6
Explanation: The ugly numbers are 2, 3, 4, 6, 8, 9, 10, 12... The 4th is 6.

Example 3:

Input: n = 5, a = 2, b = 11, c = 13
Output: 10
Explanation: The ugly numbers are 2, 4, 6, 8, 10, 11, 12, 13... The 5th is 10.

 

Constraints:

  • 1 <= n, a, b, c <= 109
  • 1 <= a * b * c <= 1018
  • It is guaranteed that the result will be in range [1, 2 * 109].

Solutions

Solution 1: Binary Search + Inclusion-Exclusion Principle

We can transform the problem into: find the smallest positive integer x such that the number of ugly numbers less than or equal to x is exactly n.

For a positive integer x, there are \left\lfloor xa \right\rfloor numbers divisible by a, \left\lfloor xb \right\rfloor numbers divisible by b, \left\lfloor xc \right\rfloor numbers divisible by c, \left\lfloor xlcm(a, b) \right\rfloor numbers divisible by both a and b, \left\lfloor xlcm(a, c) \right\rfloor numbers divisible by both a and c, \left\lfloor xlcm(b, c) \right\rfloor numbers divisible by both b and c, and \left\lfloor xlcm(a, b, c) \right\rfloor numbers divisible by a, b, and c at the same time. According to the inclusion-exclusion principle, the number of ugly numbers less than or equal to x is:

\left\lfloor xa \right\rfloor + \left\lfloor xb \right\rfloor + \left\lfloor xc \right\rfloor - \left\lfloor xlcm(a, b) \right\rfloor - \left\lfloor xlcm(a, c) \right\rfloor - \left\lfloor xlcm(b, c) \right\rfloor + \left\lfloor xlcm(a, b, c) \right\rfloor

We can use binary search to find the smallest positive integer x such that the number of ugly numbers less than or equal to x is exactly n.

Define the left boundary of binary search as l=1 and the right boundary as r=2 × 109, where 2 × 109 is the maximum value given by the problem. In each step of binary search, we find the middle number mid. If the number of ugly numbers less than or equal to mid is greater than or equal to n, it means that the smallest positive integer x falls in the interval [l,mid], otherwise it falls in the interval [mid+1,r]. During the binary search process, we need to continuously update the number of ugly numbers less than or equal to mid until we find the smallest positive integer x.

The time complexity is O(log m), where m = 2 × 109. The space complexity is O(1).

PythonJavaC++GoTypeScript
class Solution: def nthUglyNumber(self, n: int, a: int, b: int, c: int) -> int: ab = lcm(a, b) bc = lcm(b, c) ac = lcm(a, c) abc = lcm(a, b, c) l, r = 1, 2 * 10**9 while l < r: mid = (l + r) >> 1 if ( mid // a + mid // b + mid // c - mid // ab - mid // bc - mid // ac + mid // abc >= n ): r = mid else: l = mid + 1 return l(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !