二的幂数组中查询范围内的乘积
难度:
标签:
题目描述
代码结果
运行时间: 97 ms, 内存: 42.1 MB
// Java Stream solution
// 思路:
// 1. 找到最小数量的2的幂次表示n
// 2. 使用Java Stream API简化查询处理和乘积计算
import java.util.*;
public class SolutionStream {
private static final int MOD = 1000000007;
public static List<Integer> findPowers(int n) {
List<Integer> powers = new ArrayList<>();
int power = 1;
while (n > 0) {
if ((n & 1) == 1) {
powers.add(power);
}
n >>= 1;
power *= 2;
}
return powers;
}
public static int[] getQueryResults(int n, int[][] queries) {
List<Integer> powers = findPowers(n);
return Arrays.stream(queries)
.mapToInt(q -> {
return (int) Arrays.stream(powers.subList(q[0], q[1] + 1))
.mapToLong(Integer::longValue)
.reduce(1, (a, b) -> (a * b) % MOD);
})
.toArray();
}
public static void main(String[] args) {
int n = 15;
int[][] queries = {{0, 1}, {2, 2}, {0, 3}};
int[] results = getQueryResults(n, queries);
System.out.println(Arrays.toString(results)); // 输出: [2, 4, 64]
}
}
解释
方法:
题解的思路是首先找出n的二进制表示中所有的1所对应的幂,将这些幂存入power数组中。接着,构建一个二维数组res,用于存储所有可能的查询区间[l, r]内的幂的乘积。最后,对于每个查询,直接从res数组中取出对应的结果。
时间复杂度:
O((log n)^2 + q)
空间复杂度:
O((log n)^2)
代码细节讲解
🦆
为什么在寻找powers数组时,选择使用二进制表示中1的位置对应的幂?这种方法和直接生成2的幂次方有什么不同?
▷🦆
题解中提到构建res数组用于存储所有可能的查询区间内的幂的乘积,这种方法是否存在内存效率低下的问题,特别是当n较大时?
▷🦆
在计算乘积时,题解使用了取模操作,这是基于什么原因?是否考虑到了整数溢出的问题?
▷