Leetcode Top 100
11. Container With Most Water (O(n)솔루션 존재)
오리_꿀꿀
2021. 1. 8. 19:56
물을 가둘 수 있는 가장 넓이가 큰 값을 구하는 것이다.
1. 브루트 포스
class Solution:
def maxArea(self, height: List[int]) -> int:
maxi = 0
for i in range(len(height)):
for j in range(i,len(height)):
if maxi < (j-i)*min(height[i],height[j]):
maxi = (j-i)*min(height[i],height[j])
return maxi
# O(n^2) -> 시간초과 발생
dp 문제라고 생각했는데 아니여서 브루트포스로 일단 풀었지만, 시간 초과가 나왔다.
2. left, right index 사용
가장 최대 넓이가 될 조건은, 일단 index간의 거리가 멀어야하고, 높이가 최대한 높은 것들로만 구성이 되어야 한다.
- index간 거리가 먼 순서부터 고려해야하므로, left index = 0, right index = len(height)-1 로 시작한다. (가장 멀게)
- 넓이를 maximum과 비교하고, 두 index중 높이값이 작은 것은 옆으로 한 칸 전진한다.
class Solution:
def maxArea(self, height: List[int]) -> int:
maxi = 0
left = 0
right = len(height) - 1
while left != right:
if maxi < (right-left)*min(height[left],height[right]):
maxi = (right-left)*min(height[left],height[right])
if height[left] <= height[right]:
left += 1
else: right -= 1
return maxi
시간복잡도 O(n) 알고리즘 해설 동영상