太阳能板最大面积(java)

该问题是一个使用双指针策略解决的算法问题,目标是找到一组支柱,使得太阳能板的面积最大。输入为支柱高度数组,通过从两端向中间移动指针,每次取较短支柱计算面积,并更新最大面积。最终输出最大可能的太阳能板面积。代码示例使用Java实现,有效地避免了全排列遍历,提高了效率。
摘要由CSDN通过智能技术生成

太阳能板最大面积

难度:★★

中规中矩的双指针题目。暴力for循环过不了全部样例。

太阳能板最大面积

知识点分治

时间限制:1s 空间限制:32MB 限定语言:不限

题目描述:

给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条),再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那根支柱长度。如图:

1f00cd96f19154925c933d3bdcccd5e0.png

现提供一组整形数组的支柱高度数据,假设每根支柱间距离相等为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); // 输出最大太阳能板面积
}

代码说明:

代码思路和实现说明如下:

  1. 首先,通过Scanner读取输入的支柱高度数据,并将其存储在一个字符串数组s中。
  2. 创建一个整型数组si,用于存储转换为整数的支柱高度数据。
  3. 初始化start为0,ends的长度减1,表示起始和结束的指针位置。
  4. 初始化area为0,用于存储最大太阳能板面积的值。
  5. 使用while循环,当start小于end时执行以下步骤:
    • si[start]si[end]中选择较小的值作为当前支柱的高度min
    • 计算当前太阳能板的面积,即min * (end - start)
    • 如果当前面积大于area,则更新area的值为当前面积。
    • 如果si[start]大于si[end],则将end减1,否则将start加1。
  6. 循环结束后,输出最大太阳能板面积area的值。

利用双指针的思路,通过从两侧向中间移动指针,并根据较小的支柱高度计算太阳能板的面积。这种方法避免了对所有可能组合的遍历,从而减少了计算的时间复杂度。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜柠函

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值