Description

Assume you are an awesome parent and want to give your children some cookies. But, you should give each child at most one cookie.

Each child i has a greed factor g[i], which is the minimum size of a cookie that the child will be content with; and each cookie j has a size s[j]. If s[j] >= g[i], we can assign the cookie j to the child i, and the child i will be content. Your goal is to maximize the number of your content children and output the maximum number.

Example 1:

  • Input: g = [1,2,3], s = [1,1]
  • Output: 1
  • Explanation: You have 3 children and 2 cookies. The greed factors of 3 children are 1, 2, 3. And even though you have 2 cookies, since their size is both 1, you could only make the child whose greed factor is 1 content.
    You need to output 1.

Example 2:

  • Input: g = [1,2], s = [1,2,3]
  • Output: 2
  • Explanation: You have 2 children and 3 cookies. The greed factors of 2 children are 1, 2. You have 3 cookies and their sizes are big enough to gratify all of the children,
    You need to output 2.

Constraints:

  • 1 <= g.length <= 3 * 104
  • 0 <= s.length <= 3 * 104
  • 1 <= g[i], s[j] <= 231 - 1

Note: This question is the same as 2410: Maximum Matching of Players With Trainers.

Submitted Code

class Solution(object):
    def findContentChildren(self, g, s):
        """
        :type g: List[int]
        :type s: List[int]
        :rtype: int
        """
        if len(s) == 0:   # 쿠키가 없으면 바로 0 반환
            return 0
        
        g.sort()          # 두 리스트 정렬
        s.sort()
        
        child = 0         # g 포인터
        cookie = 0        # s 포인터

        while child <= len(g) - 1 and cookie <= len(s) - 1:
            if s[cookie] >= g[child]:   # s가 g를 만족시킬때만 child 이동
                child += 1
            cookie += 1                 # cookie 이동

        return child

Runtime: 30 ms | Beats 78.67%
Memory: 13.98 MB | Beats 95.75%

값을 오름차순으로 정렬한 뒤, 두 개의 포인터를 사용하여 Greedy 방식으로 푸는 것이 정석인 것 같다. 리스트 두 개를 정렬하기 때문에 𝑂(𝑛log𝑛 + 𝑚log𝑚)의 시간 복잡도가 소요된다.

Leave a comment