Count Number of Teams

medium array counting

Problem

There are n soldiers standing in a row, each with a distinct rating. A team is any three soldiers picked at positions i < j < k whose ratings read strictly increasing (rating[i] < rating[j] < rating[k]) or strictly decreasing (rating[i] > rating[j] > rating[k]) from left to right. Count how many different teams can be formed — the same soldier may belong to several teams.

Inputrating = [2, 5, 3, 4, 1]
Output3
The valid teams are (2,3,4), (5,4,1) and (5,3,1); each one is strictly increasing or strictly decreasing.

def num_teams(rating):
    n = len(rating)
    teams = 0
    for j in range(1, n - 1):
        less_left = greater_left = 0
        less_right = greater_right = 0
        for i in range(j):
            if rating[i] < rating[j]:
                less_left += 1
            else:
                greater_left += 1
        for k in range(j + 1, n):
            if rating[k] > rating[j]:
                greater_right += 1
            else:
                less_right += 1
        teams += less_left * greater_right
        teams += greater_left * less_right
    return teams
function numTeams(rating) {
  const n = rating.length;
  let teams = 0;
  for (let j = 1; j < n - 1; j++) {
    let lessLeft = 0, greaterLeft = 0;
    let lessRight = 0, greaterRight = 0;
    for (let i = 0; i < j; i++) {
      if (rating[i] < rating[j]) lessLeft++;
      else greaterLeft++;
    }
    for (let k = j + 1; k < n; k++) {
      if (rating[k] > rating[j]) greaterRight++;
      else lessRight++;
    }
    teams += lessLeft * greaterRight;
    teams += greaterLeft * lessRight;
  }
  return teams;
}
int numTeams(int[] rating) {
    int n = rating.length, teams = 0;
    for (int j = 1; j < n - 1; j++) {
        int lessLeft = 0, greaterLeft = 0;
        int lessRight = 0, greaterRight = 0;
        for (int i = 0; i < j; i++) {
            if (rating[i] < rating[j]) lessLeft++;
            else greaterLeft++;
        }
        for (int k = j + 1; k < n; k++) {
            if (rating[k] > rating[j]) greaterRight++;
            else lessRight++;
        }
        teams += lessLeft * greaterRight;
        teams += greaterLeft * lessRight;
    }
    return teams;
}
int numTeams(vector<int>& rating) {
    int n = rating.size(), teams = 0;
    for (int j = 1; j < n - 1; j++) {
        int lessLeft = 0, greaterLeft = 0;
        int lessRight = 0, greaterRight = 0;
        for (int i = 0; i < j; i++) {
            if (rating[i] < rating[j]) lessLeft++;
            else greaterLeft++;
        }
        for (int k = j + 1; k < n; k++) {
            if (rating[k] > rating[j]) greaterRight++;
            else lessRight++;
        }
        teams += lessLeft * greaterRight;
        teams += greaterLeft * lessRight;
    }
    return teams;
}
Time: O(n²) Space: O(1)