最大公因数等于 K 的子数组数目
难度:
标签:
题目描述
代码结果
运行时间: 29 ms, 内存: 16.1 MB
/*
题目思路:
1. 使用Java Stream来计算所有子数组的GCD。
2. 使用内联的getGCD方法来计算子数组的GCD。
3. 过滤出GCD等于k的子数组并计数。
*/
import java.util.stream.IntStream;
public class Solution {
public int subarrayGCD(int[] nums, int k) {
int n = nums.length;
return (int) IntStream.range(0, n)
.flatMap(i -> IntStream.range(i, n)
.map(j -> getGCDRange(nums, i, j)))
.filter(gcd -> gcd == k)
.count();
}
// 计算从数组下标i到j的子数组的GCD
private int getGCDRange(int[] nums, int i, int j) {
int gcd = 0;
for (int index = i; index <= j; index++) {
gcd = getGCD(gcd, nums[index]);
}
return gcd;
}
// 计算两个数的最大公因数的辅助函数
private int getGCD(int a, int b) {
return b == 0 ? a : getGCD(b, a % b);
}
}
解释
方法:
该题解通过使用滑动窗口的方法来找出所有最大公因数为k的子数组。主要步骤如下:1. 遍历数组,用数组a来存储当前考虑的子数组的信息,其中每个元素是一个列表[p[0], p[1]],p[0]代表当前子数组的最大公因数,p[1]代表该子数组最右边的索引。2. 如果当前元素x不能被k整除,则清空数组a,并记录当前的索引i0。3. 如果x可以被k整除,将x添加到数组a中,并更新a中每个元素的最大公因数。4. 删除数组a中不再满足条件的元素,并检查a中的第一个元素是否满足最大公因数为k的条件,如果满足,则将符合条件的子数组数目累加到结果ans中。
时间复杂度:
O(n^2)
空间复杂度:
O(n)
代码细节讲解
🦆
在算法中,如果当前元素x不能被k整除你是如何处理的,为什么要重置数组a并更新索引i0?
▷🦆
对于算法中更新最大公因数的方法,如何保证每次更新后数组a中的元素仍然代表一个有效的子数组?
▷🦆
算法中提到删除数组a中不符合条件的子数组,具体是基于什么条件进行删除的?
▷🦆
在确定最大公因数为k的子数组时,为什么用`a[0][1] - i0`计算符合条件的子数组数量?
▷