1. 程式人生 > 實用技巧 >1395. Count Number of Teams

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 };