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: 3Explanation: 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: 0Explanation: We can't form any team given the conditions.
Example 3:
Input: rating = [1,2,3,4]Output: 4
Constraints:
n == rating.length1 <= n <= 2001 <= rating[i] <= 10^5
题意
从数组中选出三个下标i、j、k,使得rating[i]
思路
遍历数组(除头尾),统计左/右边比当前元素小/大的数的个数,相乘求和即可得到以该元素作为中间数得到的组合的个数。
代码实现
class Solution {public int numTeams(int[] rating) {int ans = 0;for (int i = 1; i < rating.length - 1; i++) {int[] smaller = new int[2];int[] larger = new int[2];for (int j = 0; j < rating.length; j++) {if (rating[j] < rating[i]) {smaller[j < i ? 0 : 1]++;} else if (rating[j] > rating[i]) {larger[j < i ? 0 : 1]++;}}ans += smaller[0] * larger[1] + smaller[1] * larger[0];}return ans;}}
