leetcode
leetcode 2101 ~ 2150
最大公因数等于 K 的子数组数目

最大公因数等于 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?
在算法中,如果当前元素x不能被k整除,则意味着任何包含x的子数组的最大公因数不能为k。因此,需要重置数组a来停止考虑当前正在追踪的所有子数组,并重新开始。更新索引i0为当前索引i,表示从下一个元素开始可能会出现新的符合条件的子数组,这是因为当前元素x破坏了之前任何子数组的有效性。
🦆
对于算法中更新最大公因数的方法,如何保证每次更新后数组a中的元素仍然代表一个有效的子数组?
在算法中,数组a中的每个元素p被更新为当前考虑的元素x和p[0](当前子数组的最大公因数)的最大公因数。通过这种方式,我们确保每次更新后,数组a中的元素仍然代表着以当前元素x为结尾的有效子数组。当更新公因数后,如果发现公因数发生变化,这意味着部分子数组可能不再有效,这时将这部分子数组移动到数组a的末尾进行处理。
🦆
算法中提到删除数组a中不符合条件的子数组,具体是基于什么条件进行删除的?
在算法中,删除数组a中的元素是基于最大公因数的变化。当内部循环中,通过gcd函数更新后的最大公因数与原来不同时,这意味着该子数组的最大公因数已经不符合条件了。因此,这些不再有效的子数组被移动到数组a的末尾,并在每次内部循环结束时被删除。这样确保数组a中只保留那些最大公因数有效的子数组。
🦆
在确定最大公因数为k的子数组时,为什么用`a[0][1] - i0`计算符合条件的子数组数量?
用`a[0][1] - i0`计算符合条件的子数组数量是因为a[0][1]代表数组a中第一个元素(即最大公因数为k的子数组)的最右边的索引,而i0是最近一个不包含在任何有效子数组中的元素的索引。因此,`a[0][1] - i0`计算的是从i0+1(即i0之后的第一个元素)到a[0][1](包含)的所有可能的子数组数量,这些都是以a[0][1]为结尾且最大公因数为k的子数组。

相关问题