每 3 個士兵能夠組成一個做戰單位,分組規則以下:
從隊伍中選出下標分別爲 i、j、k 的 3 名士兵,他們的評分分別爲 rating[i]、rating[j]、rating[k]
做戰單位需知足: rating[i] < rating[j] < rating[k] 或者 rating[i] > rating[j] > rating[k] ,其中 0 <= i < j < k < ncode
請你返回按上述條件能夠組建的做戰單位數量。每一個士兵均可以是多個做戰單位的一部分
示例 1:
輸入:rating = [2,5,3,4,1]
輸出:3
解釋:咱們能夠組建三個做戰單位 (2,3,4)、(5,4,1)、(5,3,1) 。
示例 2:
輸入:rating = [2,1,3]
輸出:0
解釋:根據題目條件,咱們沒法組建做戰單位。
示例 3:
輸入:rating = [1,2,3,4]
輸出:4
提示:n == rating.length
1 <= n <= 200
1 <= rating[i] <= 10^5
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/count-number-of-teams
代碼以下:
(1)直接暴力枚舉leetcode
class Solution { public int numTeams(int[] rating) { int ans=0; for(int i=0;i<rating.length;i++) { for(int j=i+1;j<rating.length;j++) { for(int k=j+1;k<rating.length;k++) { if((rating[i]<rating[j]&&rating[j]<rating[k])||(rating[i]>rating[j]&&rating[j]>rating[k])) { ans++; } } } } return ans; } }
(2).枚舉中間變量get
class Solution { public int numTeams(int[] rating) { int ans=0; for(int j=1;j<rating.length-1;j++) { int zx=0;int yd=0; int zd=0;int yx=0; for(int i=0;i<j;i++) { if(rating[i]<rating[j]){ zx++; } else if(rating[i]>rating[j]){ zd++; } } for(int k=j+1;k<rating.length;k++) { if(rating[j]>rating[k]){ yx++; } else if(rating[j]<rating[k]){ yd++; } } ans+=zx*yd+zd*yx; } return ans; } }
解析:
分別對左端數值右端數值進行循環,之因此最後採用ans+=zxyd+zdyx;是由於,當咱們若是在左端找到一個比定義的中間變量小的數值時,右端就須要比中間變量大的數值,才能知足題目要求,當知足左小右大或者左大右小時,就算找到一組知足條件的數,而後加一保存,ans+=....;io