题目:
给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条),再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那根支柱长度。如图:
输入描述
10
,
9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
,
1
注释,支柱至少有两根,最多
10000
根,能支持的高度范围
1
~
10
^
9
的整数,
柱子的高度是无序的,例子中的递减是巧合
输出描述
可以支持的最大太阳板面积:(10m高支柱和5m高支柱之间)
25
示例
1
输入
10
,
9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
,
1
输出
25
备注
10
米高支柱和
5
米高支柱之间宽度为
5
,高度取小的支柱高度也是
5
面积为
25
任取其他两根支柱所能获得的面积都小于
25
所以最大面积为
25。
解题思路:
1.注意题目中黑色加粗字体,我们理解一下。也就是说对于两根柱子而言,即使一个是1,一个是9,那么这个太阳能板能安装的最大面积也只是取决于最短柱子的长度,因此我们在获取这两根柱子高度时,应该选择Math.min(arr[i],arr[j])来作为太阳能板的高度。
2.而太阳能板的宽度,则是两根柱子的索引差,用j-i即可。
3.用一个变量来保存最大的面积,通过不断比较更新最大面积。
代码:
function maxSqr(arr) {
let maxValue = 0
for(let i = 0 ; i <arr.length ; i++) {
for(let j = 0; j < arr.length;j++) {
maxValue = Math.max(maxValue,Math.min(arr[i],arr[j])*(j-i))
}
}
return maxValue
}
console.log(maxSqr([10,9,8,7,6,5,4,3,2,1])) //25
牛客网上的代码只需要处理一下输入输出即可。
代码优化:
上述代码时间复杂度较高,因此我们需要对代码进行优化。
可以使用双指针的解法,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。
因为每次移动短板,这个太阳板的最短板可能变大,下一个太阳板的面积可能增大。
而如果移动长板,则这个太阳板的短板不变或者变小,下一个太阳板的面积必然变小。
因此应该移动短板。
var maxArea = function(height) {
let i = 0 , j = height.length - 1, res = 0;
while(i<j) {
res = height[i] < height[j] ?
Math.max(res,(j-i)*height[i++]) :
Math.max(res,(j-i)*height[j--])
}
return res
};