ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

太阳能板最大面积

2026/8/9 14:09:30 拓冰建站 浏览量
太阳能板最大面积

一、题目描述

给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条),再在支柱的中间部分固定太阳能板。

但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那根支柱长度。

现提供一组整形数组的支柱高度数据,假设每根支柱间距离相等为1个单位长度,计算如何选择两根支柱可以使太阳能板的面积最大。

二、输入输出描述

输入描述
  • 一行由逗号分隔的整数,表示支柱高度。
输出描述
  • 一个整数,表示最大太阳能板面积。

三、示例

输入

10,9,8,7,6,5,4,3,2,1

输出25
说明10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高也是5,面积为25。
任取其他两根支柱所能获得的面积都小于25。
所以最大的太阳能板面积为25。

四、解题思路

1. 核心思想

使用双指针法从两端向中间贪心收缩,每次移动较矮的一侧指针,在遍历过程中计算并记录最大面积,用 O (n) 时间复杂度找到最优解。

2. 问题本质分析

这是一个最优面积求解问题

  • 容器面积公式:面积 = 宽度 × 两侧高度的较小值
  • 约束:只能选择两条竖线
  • 目标:面积最大化本质是:利用贪心策略减少无效遍历,高效找到最优两条线

3. 核心逻辑

  1. 初始状态:左指针在最左,右指针在最右(宽度最大)。
  2. 面积计算:每次用两指针间距作为宽度,较矮高度作为高计算面积。
  3. 贪心移动一定移动高度更矮的指针(因为移动高侧无法让面积变大)。
  4. 记录最大值:遍历过程中不断更新最大面积。

4. 步骤拆解

  1. 输入处理

    • 读取逗号分隔的输入字符串
    • 转为整数数组height
  2. 双指针初始化

    • left = 0(最左)
    • right = 数组长度-1(最右)
    • maxArea = 0
  3. 循环收缩指针

    • 计算当前宽度、高度、面积
    • 更新最大面积
    • 移动较矮一侧的指针
  4. 输出结果

    • 输出遍历得到的最大面积

五、代码实现

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 读取输入并按逗号分割 String[] strs = sc.next().split(","); int[] height = new int[strs.length]; for (int i = 0; i < strs.length; i++) { height[i] = Integer.parseInt(strs[i]); } // 双指针 int left = 0; int right = height.length - 1; long maxArea = 0; // 用long防止溢出 while (left < right) { int w = right - left; int h = Math.min(height[left], height[right]); long area = (long) w * h; // 更新最大面积 if (area > maxArea) { maxArea = area; } // 移动较矮的指针 if (height[left] < height[right]) { left++; } else { right--; } } System.out.println(maxArea); } }