前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言每日一题(20)最大公因数等于 K 的子数组数目

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

作者头像
对编程一片赤诚的小吴
发布2024-01-23 15:03:35
1130
发布2024-01-23 15:03:35
举报

力扣 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。

代码语言:javascript
复制
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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路分析
  • 步骤流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档