1395. Count Number of Teams
问题:
给定一组带有评分rating的士兵序列。
求从中挑出3个士兵 i, j, k (i<j<k)为一个小组,使得第 i, j, k 名士兵的 rating递增or递减。
这样的小组有多少个。
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<j) 找 i,在 j 的右边(j<k) 找 k
1. 递增的情况:
找到 i 满足 rating[i]<rating[j]:有x1种情况
找到 k 满足 rating[j]<rating[k]:有y1种情况
则满足题意的三元组有 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<j] -> less[0]:i>j: i代表k && rating i < rating j 的情况
less[1]: i<j: i代表i && rating i < rating j 的情况
greater[i<j] -> greater[0]:i>j: i代表k && rating i > rating j 的情况
greater[1]: i<j: i代表i && rating i > rating j 的情况
因此,对于当前的 j 来说,有
less[0]*greater[1] : i<j<k && rating[i] > rating[j] > rating[k] :递减
+
less[1]*greater[0] : i<j<k && rating[i] < rating[j] < rating[k] :递增
种情况。
代码参考:
1 class Solution { 2 public: 3 int numTeams(vector<int>& rating) { 4 int res=0; 5 for(int j=1; j<rating.size()-1; j++){ 6 int less[2]={0}, greater[2]={0}; 7 for(int i=0; i<rating.size(); i++){ 8 if(rating[i]<rating[j]){ 9 less[i<j]++; 10 }else if(rating[i]>rating[j]){ 11 greater[i<j]++; 12 } 13 } 14 res += (less[1]*greater[0] + less[0]*greater[1]); 15 } 16 return res; 17 } 18 };