大家好,今天我来分享我的豆包MarsCode AI刷题。这次我将解决的是最大乘积区间问题,这个问题虽然属于简单难度,但是我在做的时候也遇到了不少的问题,下面就来分享一下我是怎么解决的。
问题描述
小R手上有一个长度为 n 的数组 (n > 0),数组中的元素分别来自集合 [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。小R想从这个数组中选取一段连续的区间,得到可能的最大乘积。
你需要帮助小R找到最大乘积的区间,并输出这个区间的起始位置 x 和结束位置 y (x ≤ y)。如果存在多个区间乘积相同的情况,优先选择 x 更小的区间;如果 x 相同,选择 y 更小的区间。
注意:数组的起始位置为 1,结束位置为 n。
示例
当输入的数组arr =[1, 2, 4, 8, 0, 256, 512, 0]时,256x512得到的输出最大,因此对应数组的第6个和第7个位置,因此输出为[6, 7]。
解题步骤
这个问题思路比较简单,先定义一个乘积变量和临时乘积变量,然后直接遍历数组,如果临时乘积大于乘积,将乘积进行赋值,然后将索引返回给数组即可。
实现代码
ini
代码解读
复制代码
public static int[] solution(int n, int[] arr) {
BigInteger sum = new BigInteger(Integer.toString(arr[0]));
BigInteger temp = new BigInteger(Integer.toString(arr[0]));
int a = 1;
int b = 1;
int tempa = 1;
for (int i = 1; i < arr.length;i++) {
if (arr[i] == 0) {
temp = new BigInteger(Integer.toString(1) );
tempa = i+2;
}
else {
if(temp.equals(new BigInteger(Integer.toString(0)) )){
temp = new BigInteger(Integer.toString(1) );
tempa++;
}
BigInteger arri = new BigInteger(Integer.toString(arr[i]));
temp = arri.multiply(temp);
if (sum.min(temp) ==sum ) {
sum=temp;
a = tempa;
b = i+1;
}
}
}
return new int[] { a, b };
}
细节注意
在做这道题时,首先要注意的是,在遍历数组时,当数组元素为0时,一定要将临时乘积赋值为1,否则会影响后面的判断;其次就是计算范围溢出的问题。由于是乘积的对比,所以很可能会出现数据的溢出。int的范围是从-2^31到2^31-1,而long long的范围是从-2^63到2^63-1,在元素足够大时,也有可能出现溢出,因此我在做这道题时,运用了BigInteger类,这个类有一些独特的语法需要注意,比如在赋值时,里面的元素必须是字符串,所以要用Integer.toString方法将整数转为字符串,这个方法的优点是不会出现数据的溢出,因为本质上是字符串的比较,多大都可以。