题意:

image.png

解题思路:

  1. 思路:
  2. * 用两个指针i,j分别指向首尾,如果h[i] < h[j], i 向右移动,
  3. 反之j向左移动,直到i = j,每次迭代更新最大值;
  4. * 时间复杂度分析:两个指针总共扫描 n 次,因此总时间复杂度是 O(n).

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $height
  4. * @return Integer
  5. */
  6. function maxArea($height) {
  7. $res = 0;
  8. $i = 0; $j = count($height) - 1;
  9. while ($i < $j) {
  10. $res = max($res,
  11. min($height[$i], $height[$j]) * ($j - $i));
  12. if ($height[$i] < $height[$j]) $i++;
  13. else $j--;
  14. }
  15. return $res;
  16. }
  17. function maxArea1($height) {
  18. $max = 0;
  19. for ($i = 0; $i < count($height) - 1; ++$i) {
  20. for ($j = $i + 1; $j < count($height); ++$j) {
  21. $cur = min($height[$i], $height[$j]) * ($j - $i);
  22. $max = max ($cur, $max);
  23. }
  24. }
  25. return $max;
  26. }
  27. }

GO代码实现:

  1. func maxArea(height []int) int {
  2. n := len(height)
  3. if n < 2 {
  4. return 0
  5. }
  6. i, j, max := 0, n-1, 0
  7. for i <= j {
  8. max = Max(max, (j-i) * Min(height[i], height[j]))
  9. if height[i] <= height[j] {
  10. i++
  11. } else {
  12. j--
  13. }
  14. }
  15. return max
  16. }
  17. func Max(a, b int) int {
  18. if a > b {
  19. return a
  20. }
  21. return b
  22. }
  23. func Min(a, b int) int {
  24. if a > b {
  25. return b
  26. }
  27. return a
  28. }