1. 程式人生 > >【python3】leetcode 825. Friends Of Appropriate Ages (Medium)

【python3】leetcode 825. Friends Of Appropriate Ages (Medium)

825. Friends Of Appropriate Ages (Medium)

Some people will make friend requests. The list of their ages is given and ages[i] is the age of the ith person. 

Person A will NOT friend request person B (B != A) if any of the following conditions are true:

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

Otherwise, A will friend request B.

Note that if A requests B, B does not necessarily request A.  Also, people will not friend request themselves.

How many total friend requests are made?

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.

這道題如果遍歷a,b,時間複雜度是O(n2),妥妥超時

但是由於年齡《120,所以遍歷年齡的count,

因為一對a->b滿足條件的話,所有a年齡的人可以對所有b年齡的人發起朋友請求,總共數量count(a) * count(b)

而如果ab年齡相同,由於不能對自己發起朋友請求,所以總共數量count(a) * ( count(a) - 1)

class Solution(object):
    def numFriendRequests(self, ages):
        """
        :type ages: List[int]
        :rtype: int
        """
        count = collections.Counter(ages)
        num = 0
        ageset = list(set(ages))
        for i in range(len(ageset)):
            for j in range(len(ageset)):
                if not (ageset[i] <= 0.5*ageset[j] + 7 or (ageset[i] > ageset[j]) or (ageset[i] > 100 and ageset[j] < 100)):
                    if ageset[i] == ageset[j]:num += count[ageset[i]]*(count[ageset[i]]-1)
                    else:num += count[ageset[i]]*count[ageset[j]]
        return num