You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]).
Find two lines that together with the x-axis form a container, such that the container contains the most water.
Return the maximum amount of water a container can store.
Notice that you may not slant the container.
Example 1:
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
Plain Text
복사
Example 2:
Input: height = [1,1]
Output: 1
Plain Text
복사
Constraints:
•
n == height.length
•
2 <= n <= 105
•
0 <= height[i] <= 104
My solution
길이가 n인 정수 배열 높이가 지정된다.
i번째 선의 두 끝점이 (i, 0)과 (i, height[i])이 되도록 n개의 수직선이 그려져 있다.
x축과 함께 container를 형성하는 두 선을 찾아라. 그것은 가장 많은 물을 포함해야 한다.
용기에 저장할 수 있는 물의 최대 양을 반환한다.
용기는 기울일 수 없다.
Example 1:
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
Plain Text
복사
이 예시에서는 2번째인 8과 마지막 7이 만드는 컨테이너가 가장 많은 물을 가질 수 있다.
채울 수 있는 공간이 7개이고 높이가 7이기 때문에 총 49가 되었다.
두개의 수직선을 가리키면서 최대양을 매번 검사해주면서 업데이트해줘야된다는 생각을 했다.
인덱스만 있어도 x축의 길이는 알수 있지만 높이도 알아야 매번 최대양을 계산해줄 수 있으니 높이를 구하기 위해서 lt, rt 포인터를 height배열에 인덱스로 줘서 해당 값에 접근해 가져온다.
더 낮은 높이의 수직선만큼만 물을 채울 수 있다.
대략 이렇게 짜볼 수 있다.
let lt = 0;
let rt = len -1;
while(lt < rt) {
const 뮬의양 = (height[lt] > height[rt] ? height[rt] : height[lt]) * (rt - lt);
max = Math.max(max, 물의 양)
if(height[left] < height[right]){
// 즉, height가 작은 쪽의 포인터를 한칸씩 이동시키는 것이다.
// 이동 후에 물의 양이 더 늘어날 수 있기 때문이다.
left++;
else {
right--;
}
}
JavaScript
복사
Code
/**
* @param {number[]} height
* @return {number}
*/
const maxArea = function (height) {
let left = 0;
let right = height.length - 1;
let max = 0;
while (left < right) {
const area = Math.min(height[left], height[right]) * (right - left);
max = Math.max(max, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return max;
};
describe('maxArea', () => {
it('TC1', () => {
expect(maxArea([1, 8, 6, 2, 5, 4, 8, 3, 7])).toStrictEqual(49);
});
it('TC2', () => {
expect(maxArea([1, 1])).toStrictEqual(1);
});
});
JavaScript
복사