太阳能板最大面积
难度:★★
中规中矩的双指针题目。暴力for循环过不了全部样例。
太阳能板最大面积
知识点分治
时间限制:1s 空间限制:32MB 限定语言:不限
题目描述:
给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条),再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那根支柱长度。如图:
现提供一组整形数组的支柱高度数据,假设每根支柱间距离相等为1个单位长度,计算如何选择两根支柱可以使太阳能板的面积最大。
输入描述:
10,9,8,7,6,5,4,3,2,1
注:支柱至少有2根,最多10000根,能支持的高度范围1~10^9的整数。柱子的高度是无序的,例子中递减只是巧合。
输出描述:
可以支持的最大太阳能板面积:(10米高支柱和5米高支柱之间)
25
补充说明:
10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高也是5,面积为25。任取其他两根支柱所能获得的面积都小于25。所以最大的太阳能板面积为25。
示例1
输入
10,9,8,7,6,5,4,3,2,1
输出
25
备注:
10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高也是5,面积为25。任取其他两根支柱所能获得的面积都小于25。所以最大的太阳能板面积为25。
解题思路:
利用双指针的思路,通过从两侧向中间移动指针,并根据较小的支柱高度计算太阳能板的面积。这种方法避免了对所有可能组合的遍历,从而减少了计算的时间复杂度。
JAVA代码:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 从输入读取支柱高度数据,并使用逗号分隔得到字符串数组
String[] s = scan.nextLine().split(",");
scan.close();
// 创建整型数组,用于存储支柱高度的整数形式
int[] si = new int[s.length];
for (int i = 0; i < s.length; i++) {
// 将字符串形式的支柱高度转换为整数并存储在整型数组中
si[i] = Integer.parseInt(s[i]);
}
int start = 0; // 起始指针位置
int end = s.length - 1; // 结束指针位置
int area = 0; // 最大太阳能板面积
// 使用双指针循环计算最大太阳能板面积
while (start < end) {
// 选择较小的支柱高度作为当前支柱的高度
int min = Math.min(si[start], si[end]);
// 计算当前太阳能板的面积并更新最大面积
area = Math.max(min * (end - start), area);
if (si[start] > si[end]) {
// 如果左侧支柱高度较大,则将结束指针向左移动
end--;
} else {
// 如果右侧支柱高度较大,则将起始指针向右移动
start++;
}
}
System.out.println(area); // 输出最大太阳能板面积
}
代码说明:
代码思路和实现说明如下:
- 首先,通过
Scanner
读取输入的支柱高度数据,并将其存储在一个字符串数组s
中。 - 创建一个整型数组
si
,用于存储转换为整数的支柱高度数据。 - 初始化
start
为0,end
为s
的长度减1,表示起始和结束的指针位置。 - 初始化
area
为0,用于存储最大太阳能板面积的值。 - 使用
while
循环,当start
小于end
时执行以下步骤:- 从
si[start]
和si[end]
中选择较小的值作为当前支柱的高度min
。 - 计算当前太阳能板的面积,即
min * (end - start)
。 - 如果当前面积大于
area
,则更新area
的值为当前面积。 - 如果
si[start]
大于si[end]
,则将end
减1,否则将start
加1。
- 从
- 循环结束后,输出最大太阳能板面积
area
的值。
利用双指针的思路,通过从两侧向中间移动指针,并根据较小的支柱高度计算太阳能板的面积。这种方法避免了对所有可能组合的遍历,从而减少了计算的时间复杂度。