LeetCode 1577. Number of Ways Where Square of Number Is Equal to Product of Two Numbers Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1577. Number of Ways Where Square of Number Is Equal to Product of Two Numbers

Description

Given two arrays of integers nums1 and nums2, return the number of triplets formed (type 1 and type 2) under the following rules:

  • Type 1: Triplet (i, j, k) if nums1[i]2 == nums2[j] * nums2[k] where 0 <= i < nums1.length and 0 <= j < k < nums2.length.
  • Type 2: Triplet (i, j, k) if nums2[i]2 == nums1[j] * nums1[k] where 0 <= i < nums2.length and 0 <= j < k < nums1.length.

 

Example 1:

Input: nums1 = [7,4], nums2 = [5,2,8,9]
Output: 1
Explanation: Type 1: (1, 1, 2), nums1[1]2 = nums2[1] * nums2[2]. (42 = 2 * 8). 

Example 2:

Input: nums1 = [1,1], nums2 = [1,1,1]
Output: 9
Explanation: All Triplets are valid, because 12 = 1 * 1.
Type 1: (0,0,1), (0,0,2), (0,1,2), (1,0,1), (1,0,2), (1,1,2).  nums1[i]2 = nums2[j] * nums2[k].
Type 2: (0,0,1), (1,0,1), (2,0,1). nums2[i]2 = nums1[j] * nums1[k].

Example 3:

Input: nums1 = [7,7,8,3], nums2 = [1,2,9,7]
Output: 2
Explanation: There are 2 valid triplets.
Type 1: (3,0,2).  nums1[3]2 = nums2[0] * nums2[2].
Type 2: (3,0,1).  nums2[3]2 = nums1[0] * nums1[1].

 

Constraints:

  • 1 <= nums1.length, nums2.length <= 1000
  • 1 <= nums1[i], nums2[i] <= 105

Solutions

Solution 1: Hash Table + Enumeration

We use a hash table cnt1 to count the occurrences of each pair (nums[j], nums[k]) in nums1, where 0 ≤ j < k < m, and m is the length of the array nums1. Similarly, we use a hash table cnt2 to count the occurrences of each pair (nums[j], nums[k]) in nums2, where 0 ≤ j < k < n, and n is the length of the array nums2.

Next, we enumerate each number x in the array nums1 and calculate the value of cnt2[x2], which is the number of pairs (nums[j], nums[k]) in nums2 that satisfy nums[j] × nums[k] = x2. Similarly, we enumerate each number x in the array nums2 and calculate the value of cnt1[x2], which is the number of pairs (nums[j], nums[k]) in nums1 that satisfy nums[j] × nums[k] = x2. Finally, we return the sum of the two results.

The time complexity is O(m2 + n2 + m + n), and the space complexity is O(m2 + n2). Here, m and n are the lengths of the arrays nums1 and nums2, respectively.

PythonJavaC++GoTypeScript
class Solution: def numTriplets(self, nums1: List[int], nums2: List[int]) -> int: def count(nums: List[int]) -> Counter: cnt = Counter() for j in range(len(nums)): for k in range(j + 1, len(nums)): cnt[nums[j] * nums[k]] += 1 return cnt def cal(nums: List[int], cnt: Counter) -> int: return sum(cnt[x * x] for x in nums) cnt1 = count(nums1) cnt2 = count(nums2) return cal(nums1, cnt2) + cal(nums2, cnt1)(code-box)

Solution 2: Hash Table + Enumeration Optimization

We use a hash table cnt1 to count the occurrences of each number in nums1, and a hash table cnt2 to count the occurrences of each number in nums2.

Next, we enumerate each number x in the array nums1, and then enumerate each pair (y, v1) in cnt2, where y is the key of cnt2 and v1 is the value of cnt2. We calculate z = x2 / y. If y × z = x2, and if y = z, it means y and z are the same number, then the number of ways to choose two numbers from v1 is v1 × (v1 - 1) = v1 × (v2 - 1). If y ≠ z, then the number of ways to choose two numbers from v1 is v1 × v2. Finally, we sum all the ways and divide by 2. The division by 2 is because we count the number of ways for the pair (j, k), but (j, k) and (k, j) are the same way.

The time complexity is O(m × n), and the space complexity is O(m + n). Here, m and n are the lengths of the arrays nums1 and nums2, respectively.

PythonJavaGoTypeScript
class Solution: def numTriplets(self, nums1: List[int], nums2: List[int]) -> int: def cal(nums: List[int], cnt: Counter) -> int: ans = 0 for x in nums: for y, v1 in cnt.items(): z = x * x // y if y * z == x * x: v2 = cnt[z] ans += v1 * (v2 - int(y == z)) return ans // 2 cnt1 = Counter(nums1) cnt2 = Counter(nums2) return cal(nums1, cnt2) + cal(nums2, cnt1)(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 !