• 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 };
  • 相关阅读:
    在controller的action内, 得到用户发过来的请求地址和参数url
    php Connection timed out after 30000 milliseconds
    htmlspecialchars_decode 解决掉 &amp;
    max_spare_servers到底是个什么意思?
    mysql 不同条件count ,多条件count()
    阿里云centOS7.4 ftp连接不上的问题
    阿里云 导入自定义的镜像
    thinkphp3.2.3 + nginx 配置二级域名
    FlashFXP客户端 FTP连接,连接很慢的情况,
    PHP对象的使用,什么时候可以用中括号[], 什么时候可以用箭头->
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13335718.html
Copyright © 2020-2023  润新知