C语言每日一题(20)最大公因数等于 K 的子数组数目

力扣 2447 最大公因数等于 K 的子数组数目

题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 nums 的子数组中元素的最大公因数等于 k 的子数组数目。

子数组 是数组中一个连续的非空序列。

数组的最大公因数 是能整除数组中所有元素的最大整数。

思路分析

基于滑动窗口的思想,从数组最左边的最小连续子数组开始匹配,匹配成功一次,计数器+1,同时子数组向右扩展继续匹配下一个子数组,直到遍历整个数组结束,或者公因数小于k结束(原因是:如果公因数小于k,那继续匹配的下一个也一定小于k,此时继续循环没有意义)

公因数思路:

根据性质,a,b的最大公因数等于a,a-b的最大公因数(a>b的前提下)

步骤流程

(力扣环境下)

1.定义最大公因数函数:

如果a大于b,则将a-b的值赋给a,反之则b=b-a,循环到两者相等结束(即a-b==0),返回a或b。

2.定义i指向数组的最左边,开始遍历整个数组

每次循环:

1.定义一个target保存nums【i】的值,定义j从i位置开始遍历整个数组

j每次循环:

将target与nums【j】的最大公因数赋给target,如果target==k,怎计数器count++,同时j++扩展连续子数组(求多个值的最大公因数,可以先求两个的,再与剩下的求,以此类推),但如果target小于k,则直接跳出循环。

3.循环结束后,返回count。

int GCD(int a,int b)
{
    while((a-b)!=0)
    {
        if(a>b)
        {
            a=a-b;
        }
        else
        {
            b=b-a;
        }
    }
    return a;
}

int subarrayGCD(int* nums, int numsSize, int k){
    int i=0;
    int count=0;
    for(i=0;i<numsSize;i++)
    {
        int tar=nums[i];
        for(int j=i;j<numsSize;j++)
        {
            tar=GCD(tar,nums[j]);
            if(tar==k)
            {
                count++;
            }
            else if(tar<k)//小于k直接跳出,继续没有意义
            {
                break;
            }
        }
    }
    return count;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对编程一片赤诚的小吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值