美文网首页leetcode --- js版本程序员
leetcode-Medium-第11期-数组-Containe

leetcode-Medium-第11期-数组-Containe

作者: 石头说钱 | 来源:发表于2019-03-05 10:56 被阅读2次

    给出一个数组,索引 代表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;
    }
    
    

    相关文章

      网友评论

        本文标题:leetcode-Medium-第11期-数组-Containe

        本文链接:https://www.haomeiwen.com/subject/kxrguqtx.html