leetcode-Medium-第11期-数组-Container With Most Water

给出一个数组,索引 代表x轴线坐标,值代表Y轴坐标,求数组中两个值在坐标轴能包含的最大面积

屏幕快照 2019-03-05 下午10.10.57.png

上图蓝色面积就是下面input数组在坐标轴所能包含的最大面积:
8x7x(9-2)=49

Input: [1,8,6,2,5,4,8,3,7]
Output: 49
  • 简单解法复杂度O(n^2)
var maxArea = function(arr){
  const len = arr.length;
  let max = 0;
  for(let i = 0; i < len; i++){
    for(let j = i + 1; j < len; j++){
      const area = Math.min(arr[i],arr[j]) * (j-i)
      if(area > max){
        max = area
      }
    }
  }
  return max
}

  • 高效解法,复杂度O(n)
    思路分析
面积 = 底*高 = L*H
1 肯定需要两个值,一个左边一个右边
2 先取首尾的值,因为他们的相距最远L最长,然后高为短的那条(如果取长的,短的那条不够无法形成闭合),这样得到一个面积S
3 从两边往中间遍历,看能不能取到更大的面积S,虽然从两边往中间靠,L会变短,但是H可能会取得更大呀
4 所以这个时候就要判断左边和右边的那个值更小,就舍弃他,取舍弃他后向中间靠的下一个值
5 然后再次算面积,并进行判断...
6 当左值和右值靠在一起时,遍历结束

var max = function(arr){
  let l = 0
  let r = arr.length - 1;
    let max = 0;
    while (l < r) {
        max = Math.max(max, Math.min(arr[l], arr[r])* (r - l));
        if (arr[l] < arr[r])
            l++;
        else
            r--;
    }
    return max;
}

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容