LeetCode 1395. Count Number of Teams Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1395. Count Number of Teams

Description

There are n soldiers standing in a line. Each soldier is assigned a unique rating value.

You have to form a team of 3 soldiers amongst them under the following rules:

  • Choose 3 soldiers with index (i, j, k) with rating (rating[i], rating[j], rating[k]).
  • A team is valid if: (rating[i] < rating[j] < rating[k]) or (rating[i] > rating[j] > rating[k]) where (0 <= i < j < k < n).

Return the number of teams you can form given the conditions. (soldiers can be part of multiple teams).

 

Example 1:

Input: rating = [2,5,3,4,1]
Output: 3
Explanation: We can form three teams given the conditions. (2,3,4), (5,4,1), (5,3,1). 

Example 2:

Input: rating = [2,1,3]
Output: 0
Explanation: We can't form any team given the conditions.

Example 3:

Input: rating = [1,2,3,4]
Output: 4

 

Constraints:

  • n == rating.length
  • 3 <= n <= 1000
  • 1 <= rating[i] <= 105
  • All the integers in rating are unique.

Solutions

Solution 1: Enumerate Middle Element

We can enumerate each element rating[i] in the array rating as the middle element, then count the number of elements l that are smaller than it on the left, and the number of elements r that are larger than it on the right. The number of combat units with this element as the middle element is l × r + (i - l) × (n - i - 1 - r). We can add this to the answer.

The time complexity is O(n2), and the space complexity is O(1). Where n is the length of the array rating.

PythonJavaC++GoTypeScript
class Solution: def numTeams(self, rating: List[int]) -> int: ans, n = 0, len(rating) for i, b in enumerate(rating): l = sum(a < b for a in rating[:i]) r = sum(c > b for c in rating[i + 1 :]) ans += l * r ans += (i - l) * (n - i - 1 - r) return ans(code-box)

Solution 2: Binary Indexed Tree

We can use two binary indexed trees to maintain the number of elements l that are smaller than each element on the left in the array rating, and the number of elements r that are larger than it on the right. Then count the number of combat units with this element as the middle element as l × r + (i - l) × (n - i - 1 - r), and add this to the answer.

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

PythonJavaC++GoTypeScript
class BinaryIndexedTree: def __init__(self, n: int): self.n = n self.c = [0] * (n + 1) def update(self, x: int, v: int): while x <= self.n: self.c[x] += v x += x & -x def query(self, x: int) -> int: s = 0 while x: s += self.c[x] x -= x & -x return s class Solution: def numTeams(self, rating: List[int]) -> int: nums = sorted(set(rating)) m = len(nums) tree1 = BinaryIndexedTree(m) tree2 = BinaryIndexedTree(m) for v in rating: x = bisect_left(nums, v) + 1 tree2.update(x, 1) n = len(rating) ans = 0 for i, v in enumerate(rating): x = bisect_left(nums, v) + 1 tree1.update(x, 1) tree2.update(x, -1) l = tree1.query(x - 1) r = n - i - 1 - tree2.query(x) ans += l * r ans += (i - l) * (n - i - 1 - r) return ans(code-box)

Solution 3: Recursion + Memoization

TypeScriptJavaScript
function numTeams(rating: number[]): number { const n = rating.length; const f: Record<Type, number[][]> = { asc: Array.from({ length: n }, () => Array(3).fill(-1)), desc: Array.from({ length: n }, () => Array(3).fill(-1)), }; const fn = (i: number, available: number, type: Type) => { if (!available) { return 1; } if (f[type][i][available] !== -1) { return f[type][i][available]; } let ans = 0; for (let j = i + 1; j < n; j++) { if (rating[j] > rating[i]) { if (type === 'asc') { ans += fn(j, available - 1, 'asc'); } } else { if (type === 'desc') { ans += fn(j, available - 1, 'desc'); } } } f[type][i][available] = ans; return ans; }; let ans = 0; for (let i = 0; i < n; i++) { ans += fn(i, 2, 'asc') + fn(i, 2, 'desc'); } return ans; } type Type = 'asc' | 'desc';(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 !