n개의 음이 아닌 정수 a1, a2, ..., an, 각 값이 좌표(i, a[i])의 한 점을 나타낸다고 가정합니다. 라인 i의 두 끝점이 (i, a[i]) 및 (i, a[0])에 있도록 n개의 수직선이 존재합니다. x축과 함께 하나의 컨테이너를 형성하는 두 개의 선을 찾아야 하므로 물의 양이 최대인 두 개의 열을 찾는 것이 목표입니다. 따라서 배열이 [1,8,6,2,5,4,8,3,7]과 같으면
음영 처리된 부분은 높이가 7이고 섹션이 7개이므로 전체 면적은 실제로 7 * 7 =49입니다. 이것이 출력입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다.
- low :=0, high :=arr의 길이 – 1, ans :=0
- 낮은 동안 <높음
- arr[낮음]
- 그렇지 않으면 min_h :=height[high] 및 min_ind :=high
- ans :=(높음 – 낮음)* min_h 및 ans의 최대값
- 낮은 값 + 1 =min_ind + 1이면 낮은 값을 1씩 늘리고 그렇지 않으면 높은 값을 1씩 줄입니다.
- arr[낮음]
- 반환
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
class Solution(object): def maxArea(self, height): low = 0 high = len(height) - 1 ans = 0 while low < high: if height[low]<height[high]: min_height = height[low] min_height_index = low else: min_height = height[high] min_height_index = high ans = max(((high - low) ) * min_height,ans) if low+1==min_height_index+1: low+=1 else: high-=1 return ans ob1 = Solution() print(ob1.maxArea([1,8,6,2,5,4,8,3,7]))
입력
[1,8,6,2,5,4,8,3,7]
출력
49