바구니에 담긴 과일

1561 단어 theabbieleetcodedsa
왼쪽에서 오른쪽으로 일렬로 늘어선 과일 나무가 있는 농장을 방문하고 있습니다. 나무는 정수 배열fruits로 표시되며 여기서 fruits[i]는 나무가 생산하는 과일의 유형입니다.

가능한 한 많은 과일을 수집하고 싶습니다. 그러나 소유자는 따라야 하는 몇 가지 엄격한 규칙을 가지고 있습니다.
  • 바구니가 두 개뿐이고 각 바구니에는 한 종류의 과일만 담을 수 있습니다. 각 바구니에 담을 수 있는 과일의 양에는 제한이 없습니다.
  • 선택한 나무에서 시작하여 오른쪽으로 이동하는 동안 모든 나무(시작 나무 포함)에서 정확히 하나의 과일을 선택해야 합니다. 수확한 과일은 바구니 중 하나에 맞아야 합니다.
  • 바구니에 담을 수 없는 과일이 있는 나무에 도달하면 멈춰야 합니다.

  • 정수 배열ith이 주어지면 선택할 수 있는 최대 과일 수를 반환합니다.

    예 1:

    입력: 과일 = [1,2,1]
    출력: 3
    설명: 3개의 나무 모두에서 선택할 수 있습니다.

    예 2:

    입력: 과일 = [0,1,2,2]
    출력: 3
    설명: 트리 [1,2,2]에서 선택할 수 있습니다.
    첫 번째 트리에서 시작했다면 [0,1] 트리에서만 선택합니다.

    예 3:

    입력: 과일 = [1,2,3,2,2]
    출력: 4
    설명: 트리 [2,3,2,2]에서 선택할 수 있습니다.
    첫 번째 트리에서 시작했다면 트리[1,2]에서만 선택합니다.

    제약:
  • fruits
  • 1 <= fruits.length <= 105

  • 해결책:

    class Solution:
        def totalFruit(self, fruits: List[int]) -> int:
            n = len(fruits)
            i = 0
            j = 0
            ctr = {}
            mlen = 0
            while i <= j and j < n:
                ctr[fruits[j]] = ctr.get(fruits[j], 0) + 1
                j += 1
                if len(ctr) <= 2:
                    mlen = max(mlen, j - i)
                else:
                    while len(ctr) > 2 and i < j:
                        ctr[fruits[i]] -= 1
                        if ctr[fruits[i]] == 0:
                            del ctr[fruits[i]]
                        i += 1
            return mlen
    

    좋은 웹페이지 즐겨찾기