1395. Count Number of Teams

问题:

给定一组带有评分rating的士兵序列。

求从中挑出3个士兵 i, j, k (i

这样的小组有多少个。

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
1 <= n <= 200
1 <= rating[i] <= 10^5

  

解法:

由于是3元组,

那么我们以中间元素 j 为参照系,

分别 在 j 的左边(i

1. 递增的情况:

找到 i 满足 rating[i]找到 k 满足 rating[j]

则满足题意的三元组有 x1*y1 种情况。

2. 递减的情况:

找到 i 满足 rating[i]>rating[j]:有x2种情况
找到 k 满足 rating[j>rating[k]:有y2种情况

则满足题意的三元组有 x2*y2 种情况。

对此时的 j 来说,一共有 x1*y1+x2*y2 种情况。

 

代码实现上,

我们遍历 j 从第二个元素 j=1 开始,到倒数第二个元素 j=size-2。(由于j为三元组中间元素,前面必有 i,后面必有 k)

对于每一个 j ,

我们遍历整个序列,找 i,k

使用 less保存 rating i < rating j 的情况

使用 greater保存  rating i > rating j 的情况

那么同时找 i 和 k 的话,一个 小于 j, 一个 大于 j

less[i less[0]:i>j: i代表k && rating i < rating j 的情况
                less[1]: ii && rating i < rating j 的情况
greater[i greater[0]:i>j: i代表k && rating i > rating j 的情况
                     greater[1]: ii && rating i > rating j 的情况

因此,对于当前的 j 来说,有

less[0]*greater[1]  : i rating[j] > rating[k] :递减

+

less[1]*greater[0] : i

种情况。

 

代码参考:

 1 class Solution {
 2 public:
 3     int numTeams(vector<int>& rating) {
 4         int res=0;
 5         for(int j=1; j1; j++){
 6             int less[2]={0}, greater[2]={0};
 7             for(int i=0; i){
 8                 if(rating[i]<rating[j]){
 9                     less[i;
10                 }else if(rating[i]>rating[j]){
11                     greater[i;
12                 }
13             }
14             res += (less[1]*greater[0] + less[0]*greater[1]);
15         }
16         return res;
17     }
18 };

 

你可能感兴趣的:(1395. Count Number of Teams)