leetcode316场周赛(最大公因数等于 K 的子数组数目)
题目
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 nums 的子数组中元素的最大公因数等于 k 的子数组数目。
1.子数组 是数组中一个连续的非空序列。
2.数组的最大公因数 是能整除数组中所有元素的最大整数。
例子:
输入:nums = [9,3,1,2,6,3], k = 3
输出:4
解释:nums 的子数组中,以 3 作为最大公因数的子数组如下:
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]
提示:
1 <= nums.length <= 1000
1 <= nums[i], k <= 10^9
题解
- 既然有涉及到最大公因数的问题,首先需要思考如何算出两个数的最大公因数(辗转相除法)
- 求一个关于子数组的问题,肯定是需要变量进行维护且更新,同时数据量不大可以使用双层循环
代码
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
//这里是通过递归求出两个数的最大公因数的函数
var gcd = function(a, b){
return b == 0 ? a : gcd(b, a%b);
}
var subarrayGCD = function(nums, k) {
let ans= 0;
for(let i = 0 ; i < nums.length ; i++){
// 每次会进行最大公因数的判断
let nn = 0
for(let j = i ; j < nums.length ; j++) {
nn = gcd(nn,nums[j])
// 这里忽略了一个if,是nn>k,假如大于的话其实无法判断后面的元素与现元素的最大公因数是否为k
// 因此继续循环使得j往后移动一个单位继续判断
if(nn == k) {
ans++
}
// 如果算出的公因数小于k了那么不可能会在子数组中,因此在大循环中继续寻找子数组
if(nn < k){
break
}
}
}
return ans
};
总结
其实本题思路较为简单,涉及最大公因数的计算以及子数组的处理。