1395. Count Number of Teams

Posted habibah-chang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 };

 

以上是关于1395. Count Number of Teams的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 1395. Count Number of Teams

LeetCode 1395. 统计作战单位数

Lintcode: Count of Smaller Number

Count the number of occurrences in a sorted array

[LeetCode] 1248. Count Number of Nice Subarrays

[LeetCode] 1248. Count Number of Nice Subarrays 统计优美子数组