(有漏洞 错误解法) 316周赛T2滑窗题解0毫秒-最大公因数等于 K 的子数组数目
1490
2022.10.23
2022.10.23
发布于 未知归属地

已证实逻辑有漏洞,坐等喜提第一次rejudge掉了哈哈哈,下面有大佬提出漏洞!

以下原贴
——
题目没到题库所以题解发贴啦,比赛t2冷门解法过的(说不定有漏洞会被re?)还挺开心,分享思路抛砖引玉~~~
题目链接:[https://leetcode.cn/contest/weekly-contest-316/problems/number-of-subarrays-with-gcd-equal-to-k/]

316周赛T2-6224.最大公因数等于 K 的子数组数目-解题思路

1.递推
[1]如果向右滑动后最大公因数小于k,或大于k且不能被k整除,继续右滑也一定无法得到等于k,因此可断开子数组重新连续。
[2]每次右滑,以之前算出的最大公因数和新连续的元素计算新的最大公因数。
2.计数
记录p为最远(最右)能够使得子数组最大公因数==k的元素的下标,以此为固定数组的边界,[l,p-1](p>l)是可以连续也可以不连续的区间因此可以多算数目,子数组数目=Math.min(r,p)-l+1的长度。
例1:nums=[3,12,9,6],k=3
当前窗口=[3]时,p=元素3所在的下标0,计入[3]数目+1。
当前窗口=[3,12]时,p=元素3所在的下标0,只能计入[3,12]数目+1,而不能计入[12]。
当前窗口=[3,12,9]时,p=元素12所在的下标1,可以计入[12,9]+[3,12,9]数目+2。
当前窗口=[3,12,9,6]时,p=元素9所在的下标2,可以计入[9,6]+[12,9,6]+[3,12,9,6]数目+3。
gcd=[3,3,3,3]
c=1+1+2+3=7
3.判断固定数组边界逻辑
if[1]若新增元素==k,p=该元素下标。
else if[2]若新增元素和前一个元素的最大公因数==k,p=该元素下标-1。(推演可发现如果不满足该条件,那么之后也不可能成为p)
else[3]沿用上次计算的p下标不变。

公因数.jpg

代码

Java
class Solution {
    public int subarrayGCD(int[] nums, int k) {
        int n=nums.length,l=0,r=0,f=nums[r],p=0,c=0;
        while(r<n){
            int e=gcd(f,nums[r]);
            if(e<k||(e>k&&e%k!=0)){
                r++;
                if(r==n)break;
                l=r;
                f=nums[r];
                p=l;
                continue;
            }else if(e==k){
                if(nums[r]==k){
                    c+=r-l+1;
                    p=r;
                }else if(r>0&&gcd(nums[r-1],nums[r])==k){
                    c+=r-l;
                    p=r-1;
                }else{
                    c+=Math.min(r,p)-l+1;
                }
            }
            f=e;
            r++;
        }
        return c;
    }
    public int gcd(int a,int b){
        if(a<b)return gcd(b,a);
        return a%b==0?b:gcd(b,a%b);
    }
}
评论 (12)