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