LeetCode978. 최장 급류 서브 그룹 (동적 기획)

2209 단어 동적 기획
1. 제목 설명
https://leetcode-cn.com/problems/longest-turbulent-subarray/
A의 하위 그룹 A[i], A[i+1],......,A[j]에서 다음 조건을 충족하면 물살 흐름 하위 배열이라고 합니다.
만약 i<=k < j, k가 홀수일 경우 A[k]> A[k+1], 그리고 k가 짝수일 경우 A[k] A[k+1], 그리고 k가 홀수일 경우 A[k]A의 최대 물살 흐름 서브 그룹의 길이를 되돌려줍니다.
  :[9,4,2,10,7,8,8,1,9]
  :5
  :(A[1] > A[2] < A[3] > A[4] < A[5])
  :[4,8,12,16]
  :2

2. 코드 설명
상태 정의:
  • increase[i]:arr[i]로 끝내고arr[i-1]
  • decrease[i]:arr[i]로 끝내고arr[i-1]>arr[i]의 물살 유수 그룹의 길이
  • 상태 전환 방정식:
  • increase[i] = decrease[i - 1] + 1 if arr[i - 1] < arr[i] for i > 0
  • decrease[i] = increase[i - 1] + 1 if arr[i - 1] > arr[i] for i > 0

  • 초기화: 원소가 하나일 때 물살 수조의 길이는 1이다.출력: 두 상태 수조의 모든 원소의 최대 값은 가장 긴 물살 수조의 길이이다.공간 최적화: 공간 최적화: 현재 단계 상태는 전 단계 상태와 관계가 있기 때문에 상태 그룹을 중복 이용할 수 있다.
    class Solution:
        def maxTurbulenceSize(self, arr: List[int]) -> int:
            n = len(arr)
            if n < 2:
                return n
    
            increase = [1] * n  #     i    ,   arr[i - 1] < arr[i]           
            decrease = [1] * n  #     i    ,   arr[i - 1] > arr[i]           
    
            res = 1
            for i in range(1, n):
                if arr[i-1] < arr[i]:
                    increase[i] = decrease[i-1] + 1
                    decrease[i] = 1
                elif arr[i-1] > arr[i]:
                    decrease[i] = increase[i-1] + 1
                    increase[i] = 1
                else:
                    # ==
                    increase[i] = 1
                    decrease[i] = 1
                res = max(res, max(increase[i], decrease[i]))
            return res
    
    
    arr = [9,4,2,10,7,8,8,1,9]
    s = Solution()
    print(s.maxTurbulenceSize(arr))

    https://leetcode-cn.com/problems/longest-turbulent-subarray/solution/zui-chang-tuan-liu-zi-shu-zu-by-leetcode-zqoq/
    https://leetcode-cn.com/problems/longest-turbulent-subarray/solution/yi-zhang-dong-tu-xiang-jie-dong-tai-gui-wrwvn/

    좋은 웹페이지 즐겨찾기