LeetCode. Container With Most Water
2016-04-02 15:49
501 查看
试题概述
Given n non-negative integers a1a_1, a2a_2, …, ana_n, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, aia_i) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.Note: You may not slant the container.
题目大概是说在笛卡尔坐标系中给定n个点, 这n个点的坐标都在x轴上方, 向x轴作垂线段可得到x条线段. 从中选择两条线段, 使得这两条线段和x轴形成的水缸得面积最大.
解题思路
最简单粗暴的方法是穷举这n22\frac{n^2}{2}种组合方式, 不用想也知道妥妥的TLE.假设有2个指针i, j. i从最左侧出发, j从最右侧出发. 因为水缸的高度是由二者中的较小值决定的. 当height[i] < height[j]时, ++ i. 假设i的值不变, – j, 不可能得到更优解(因为水缸的长度在减小, 高度不可能超过height[i]). 反之, – j. 并记录每次移动i, j后的水缸面积, 并更新水缸面积的最大值.
源代码
public class Solution { public int maxArea(int[] height) { int i = 0, j = height.length - 1; int maxArea = getArea(height, i, j); while ( i < j ) { if ( height[i] < height[j] ) { ++ i; } else { -- j; } int currentArea = getArea(height, i, j); if ( currentArea > maxArea ) { maxArea = currentArea; } } return maxArea; } private int getArea(int[] height, int i, int j) { int a = Math.min(height[i], height[j]); int b = j - i; return a * b; } public static void main(String[] args) { Solution s = new Solution(); int[] height = {2, 3, 10, 5, 7, 8, 9}; System.out.println(s.maxArea(height)); } }
相关文章推荐
- IBM openblockchain学习(三)--Ledger源码分析
- 【LeetCode】220. Contains Duplicate III
- error: command 'gcc' failed with exit status 1 的解决办法
- RAID5工作原理介绍
- 219. Contains Duplicate II
- LeetCode 336. Palindrome Pairs
- DrawableContainer
- lintcode-medium-Number of Airplanes in the Sky
- 使用MacBook Air的4项基本技巧
- Xenomai on the Beaglebone Black in 14 easy steps ---fwqlzz love is for ever
- 11. Container With Most Water
- 阶梯博弈(Stair Nim)
- leetcode 172. Factorial Trailing Zeroes
- rails中使用ajax
- 领域驱动设计(Domain Driven Design)参考架构详解
- leetcode 每日一题 172. Factorial Trailing Zeroes
- tail -F查看线上日志
- Run-Time Check Failure #0 错误
- leetcode 70. Climbing Stairs
- 【HDU】 1023 Train Problem II