zoukankan      html  css  js  c++  java
  • 825. Friends Of Appropriate Ages

    问题:

    给定一个年龄数组,代表一组人的年龄,他们任何一个人A会向除了以下3个条件外的任意B发送好友请求,A->B

    • age[B] <= 0.5 * age[A] + 7
    • age[B] > age[A]
    • age[B] > 100 && age[A] < 100

    请问,一共可能发送多少请求。

    Example 1:
    Input: [16,16]
    Output: 2
    Explanation: 2 people friend request each other.
    
    Example 2:
    Input: [16,17,18]
    Output: 2
    Explanation: Friend requests are made 17 -> 16, 18 -> 17.
    
    Example 3:
    Input: [20,30,100,110,120]
    Output: 
    Explanation: Friend requests are made 110 -> 100, 120 -> 110, 120 -> 100.
     
    
    Notes:
    1 <= ages.length <= 20000.
    1 <= ages[i] <= 120.
    

      

    解法:

    从除外条件,反推满足条件:

    1<=age[A]<=120 1<=age[B]<=120

    A会找比他小或同岁,且不能太小(>0.5*age[A]+7)的B

    而第三个条件,已经被以上条件涵盖。

    A发请求的满足条件的情况为:0.5*age[A]+7 < age[B] <= age[A]

    由上述age[A]的关系:0.5*age[A]+7 < age[A]

    可得:14 < age[A]
    因此age[A]的范围为: [ 15 ~ 120 ]

    age[B]的范围为:[ 0.5*age[A]+8 ~ age[A] ]

    当A遇到,满足以上条件的B,则会发送好友请求。数量为:age[A]的人数*age[B]的人数。(其中,当两个岁数相同,自己不会给自己发送请求,age[A]的人数*(age[B]的人数-1))

    代码参考:

     1 class Solution {
     2 public:
     3     int numFriendRequests(vector<int>& ages) {
     4         int res=0;
     5         map<int, int>agescout;
     6         for(int age:ages){
     7             agescout[age]++;
     8         }
     9         for(int i=15; i<=120; i++){//A
    10             for(int j=0.5*i+8; j<=i; j++){//B
    11                 res+=(agescout[i]*(agescout[j]-(i==j?1:0)));
    12             }
    13         }
    14         return res;
    15     }
    16 };
  • 相关阅读:
    Tomcat全攻略
    JAVA必备——13个核心规范
    利用Node.js实现模拟Session验证的登陆
    Android中关于JNI 的学习(六)JNI中注冊方法的实现
    pomelo源代码分析(一)
    怎样解决栈溢出
    String,StringBuffer与StringBuilder的差别??
    ERWin 7.1 和7.2 的官方FTP下载地址
    C/C++中各种类型int、long、double、char表示范围(最大最小值)
    下拉刷新,上拉装载许多其他ListView
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/12877401.html
Copyright © 2011-2022 走看看