You are given two non-negative integers num1
and num2
.
In one operation, if num1 >= num2
, you must subtract num2
from num1
, otherwise subtract num1
from num2
.
num1 = 5
and num2 = 4
, subtract num2
from num1
, thus obtaining num1 = 1
and num2 = 4
. However, if num1 = 4
and num2 = 5
, after one operation, num1 = 4
and num2 = 1
.Return the number of operations required to make either num1 = 0
or num2 = 0
.
Example 1:
Input: num1 = 2, num2 = 3 Output: 3 Explanation: - Operation 1: num1 = 2, num2 = 3. Since num1 < num2, we subtract num1 from num2 and get num1 = 2, num2 = 3 - 2 = 1. - Operation 2: num1 = 2, num2 = 1. Since num1 > num2, we subtract num2 from num1. - Operation 3: num1 = 1, num2 = 1. Since num1 == num2, we subtract num2 from num1. Now num1 = 0 and num2 = 1. Since num1 == 0, we do not need to perform any further operations. So the total number of operations required is 3.
Example 2:
Input: num1 = 10, num2 = 10 Output: 1 Explanation: - Operation 1: num1 = 10, num2 = 10. Since num1 == num2, we subtract num2 from num1 and get num1 = 10 - 10 = 0. Now num1 = 0 and num2 = 10. Since num1 == 0, we are done. So the total number of operations required is 1.
Constraints:
0 <= num1, num2 <= 105
This problem asks us to find the number of operations needed to reduce either num1
or num2
to zero. In each operation, we subtract the smaller number from the larger number. We can solve this using two approaches: simulation and a mathematical optimization.
This approach directly simulates the process described in the problem statement. We repeatedly perform operations until one of the numbers becomes zero.
Algorithm:
ans
to 0.num1
and num2
are greater than 0:
num1
is greater than or equal to num2
, subtract num2
from num1
.num1
from num2
.ans
(the operation count) by 1.ans
.Time Complexity: O(max(num1, num2)) - In the worst case, the loop runs until the larger number is reduced to 0. The number of iterations is proportional to the larger of the two input numbers.
Space Complexity: O(1) - We only use a few integer variables.
Code (Python):
class Solution:
def countOperations(self, num1: int, num2: int) -> int:
ans = 0
while num1 and num2:
if num1 >= num2:
num1 -= num2
else:
num2 -= num1
ans += 1
return ans
The simulation approach can be inefficient for large inputs. We can optimize it using the observation that repeatedly subtracting the smaller number is essentially equivalent to integer division and modulo operations.
Algorithm:
ans
to 0.num1
and num2
are greater than 0:
num1
is greater than or equal to num2
:
num1 // num2
(integer division) to ans
.num1
to num1 % num2
(modulo operation).num2 // num1
to ans
.num2
to num2 % num1
.ans
.Time Complexity: O(log(max(num1, num2))) - The number of iterations is significantly reduced because we're using division instead of repeated subtraction. The number of iterations is approximately proportional to the number of bits in the larger number.
Space Complexity: O(1)
Code (Python):
class Solution:
def countOperations(self, num1: int, num2: int) -> int:
ans = 0
while num1 and num2:
if num1 >= num2:
ans += num1 // num2
num1 %= num2
else:
ans += num2 // num1
num2 %= num1
return ans
The mathematical optimization provides a much more efficient solution for larger input values. Both approaches are correct, but the second one has a superior time complexity. The provided code examples show the optimized solution in various languages.