Given an integer array nums and an integer k, return the number of subarrays of nums where the greatest common divisor of the subarray’s elements is k.
A subarray is a contiguous non-empty sequence of elements within an array.
The greatest common divisor of an array is the largest integer that evenly divides all the array elements.
Example 1:
Input: nums = [9,3,1,2,6,3], k = 3
Output: 4
Explanation: The subarrays of nums where 3 is the greatest common divisor of all the subarray’s elements are:
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]
Example 2:
Input: nums = [4], k = 7
Output: 0
Explanation: There are no subarrays of nums where 7 is the greatest common divisor of all the subarray’s elements.
Constraints:
- 1 <= nums.length <= 1000
- 1 <= nums[i], k <= 109
欧几里得最大公约数计算方法 + 去重优化
use std::collections::{BinaryHeap, HashSet};
impl Solution {
fn calc_gcd(nums: &HashSet<i32>) -> i32 {
let mut heap = BinaryHeap::new();
let mut min = i32::MAX;
for &n in nums {
if n == 1 {
return 1;
}
min = min.min(n);
heap.push(n);
}
while let Some(n) = heap.pop() {
let r = n % min;
if r == 0 {
continue;
}
min = min.min(r);
heap.push(r);
}
min
}
pub fn subarray_gcd(nums: Vec<i32>, k: i32) -> i32 {
let mut ans = 0;
for i in 0..nums.len() {
if nums[i] % k != 0 {
continue;
}
let mut set = HashSet::new();
set.insert(nums[i]);
for j in i..nums.len() {
set.insert(nums[j]);
if Solution::calc_gcd(&set) == k {
ans += 1;
}
}
}
ans
}
}

841

被折叠的 条评论
为什么被折叠?



