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