用java写代码求数组中子数组的最大乘积及下标
时间: 2024-05-15 15:16:51 浏览: 83
设计一个函数, 找到数组中的最大值以及下标。
以下是一个可能的解决方案:
```java
public class MaxProductSubarray {
public static void main(String[] args) {
int[] nums = {2, 3, -2, 4};
int[] result = maxProductSubarray(nums);
System.out.println("最大乘积为:" + result[0] + ",起始下标为:" + result[1] + ",结束下标为:" + result[2]);
}
public static int[] maxProductSubarray(int[] nums) {
if (nums == null || nums.length == 0) {
return new int[]{0, -1, -1};
}
int maxProduct = nums[0];
int maxProductStartIndex = 0;
int maxProductEndIndex = 0;
int currentProduct = 1;
int currentProductStartIndex = 0;
for (int i = 0; i < nums.length; i++) {
currentProduct *= nums[i];
if (currentProduct > maxProduct) {
maxProduct = currentProduct;
maxProductStartIndex = currentProductStartIndex;
maxProductEndIndex = i;
}
if (currentProduct == 0) {
currentProduct = 1;
currentProductStartIndex = i + 1;
}
}
return new int[]{maxProduct, maxProductStartIndex, maxProductEndIndex};
}
}
```
解释一下代码的思路:
首先判断输入数组是否为空或长度为0,如果是,则返回一个表示最大乘积为0且起始和结束下标均为-1的结果。
然后定义变量maxProduct表示最大乘积,maxProductStartIndex表示最大乘积子数组的起始下标,maxProductEndIndex表示最大乘积子数组的结束下标,currentProduct表示当前乘积,currentProductStartIndex表示当前乘积子数组的起始下标。初始时,将maxProduct赋值为nums[0],将maxProductStartIndex和maxProductEndIndex都赋值为0,将currentProduct赋值为1,将currentProductStartIndex赋值为0。
接着使用for循环遍历数组中的每个元素。在每次循环中,将currentProduct乘上当前元素。如果currentProduct大于maxProduct,则更新maxProduct、maxProductStartIndex和maxProductEndIndex为当前值。如果currentProduct等于0,则说明当前乘积子数组的乘积为0,因此将currentProduct赋值为1,将currentProductStartIndex更新为当前下标加1。
最后返回一个长度为3的数组,第一个元素为最大乘积,第二个元素为最大乘积子数组的起始下标,第三个元素为最大乘积子数组的结束下标。
阅读全文