AI刷题97:最大乘积区间问题| 豆包MarsCode AI刷题

32 阅读2分钟

大家好,今天我来分享我的豆包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方法将整数转为字符串,这个方法的优点是不会出现数据的溢出,因为本质上是字符串的比较,多大都可以。