LeetCode 2475. Number of Unequal Triplets in Array Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
2475. Number of Unequal Triplets in Array

Description

You are given a 0-indexed array of positive integers nums. Find the number of triplets (i, j, k) that meet the following conditions:

  • 0 <= i < j < k < nums.length
  • nums[i], nums[j], and nums[k] are pairwise distinct.
    • In other words, nums[i] != nums[j], nums[i] != nums[k], and nums[j] != nums[k].

Return the number of triplets that meet the conditions.

 

Example 1:

Input: nums = [4,4,2,4,3]
Output: 3
Explanation: The following triplets meet the conditions:
- (0, 2, 4) because 4 != 2 != 3
- (1, 2, 4) because 4 != 2 != 3
- (2, 3, 4) because 2 != 4 != 3
Since there are 3 triplets, we return 3.
Note that (2, 0, 4) is not a valid triplet because 2 > 0.

Example 2:

Input: nums = [1,1,1,1,1]
Output: 0
Explanation: No triplets meet the conditions so we return 0.

 

Constraints:

  • 3 <= nums.length <= 100
  • 1 <= nums[i] <= 1000

Solutions

Solution 1: Brute Force Enumeration

We can directly enumerate all triples (i, j, k) and count all the ones that meet the conditions.

The time complexity is O(n3), where n is the length of the array nums. The space complexity is O(1).

PythonJavaC++GoTypeScriptRust
class Solution: def unequalTriplets(self, nums: List[int]) -> int: n = len(nums) ans = 0 for i in range(n): for j in range(i + 1, n): for k in range(j + 1, n): ans += ( nums[i] != nums[j] and nums[j] != nums[k] and nums[i] != nums[k] ) return ans(code-box)

Solution 2: Sorting + Enumeration of Middle Elements + Binary Search

We can also sort the array nums first.

Then traverse nums, enumerate the middle element nums[j], and use binary search to find the nearest index i on the left side of nums[j] such that nums[i] < nums[j]; find the nearest index k on the right side of nums[j] such that nums[k] > nums[j]. Then the number of triples with nums[j] as the middle element and meeting the conditions is (i + 1) × (n - k), which is added to the answer.

The time complexity is O(n × log n), and the space complexity is O(log n). Here, n is the length of the array nums.

PythonJavaC++GoTypeScriptRust
class Solution: def unequalTriplets(self, nums: List[int]) -> int: nums.sort() ans, n = 0, len(nums) for j in range(1, n - 1): i = bisect_left(nums, nums[j], hi=j) - 1 k = bisect_right(nums, nums[j], lo=j + 1) ans += (i >= 0 and k < n) * (i + 1) * (n - k) return ans(code-box)

Solution 3: Hash Table

We can also use a hash table cnt to count the number of each element in the array nums.

Then traverse the hash table cnt, enumerate the number of middle elements b, and denote the number of elements on the left as a. Then the number of elements on the right is c = n - a - b. At this time, the number of triples that meet the conditions is a × b × c, which is added to the answer. Then update a = a + b and continue to enumerate the number of middle elements b.

The time complexity is O(n), and the space complexity is O(n). Here, n is the length of the array nums.

PythonJavaC++GoRust
class Solution: def unequalTriplets(self, nums: List[int]) -> int: cnt = Counter(nums) n = len(nums) ans = a = 0 for b in cnt.values(): c = n - a - b ans += a * b * c a += b return ans(code-box)

Solution 4

Rust
impl Solution { pub fn unequal_triplets(nums: Vec<i32>) -> i32 { let mut ans = 0; let mut nums = nums; nums.sort(); let n = nums.len(); for i in 1..n - 1 { let mut l = 0; let mut r = i; while l < r { let mid = (l + r) >> 1; if nums[mid] >= nums[i] { r = mid; } else { l = mid + 1; } } let j = r; let mut l = i + 1; let mut r = n; while l < r { let mid = (l + r) >> 1; if nums[mid] > nums[i] { r = mid; } else { l = mid + 1; } } let k = r; ans += j * (n - k); } ans as i32 } }(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 !