题目:
给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条),再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那根支柱长度。如图:
输入描述
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
};
该博客探讨了如何在航天器上安装太阳能板,其中面积受限于最短支柱的长度。文章通过题目解析、代码实现和优化过程,详细解释了如何使用JavaScript找到最大面积的方法,特别是利用双指针策略降低时间复杂度。
3020

被折叠的 条评论
为什么被折叠?



