ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

LeetCode——1819. 序列中不同最大公约数的数目(Number of Different Subsequences GCDs)[困难]——分析及代码(Java)

2021-04-08 21:05:34  阅读:263  来源: 互联网

标签:Different Java GCDs nums int gcdNum 最大公约数 序列


LeetCode——1819. 序列中不同最大公约数的数目[Number of Different Subsequences GCDs][困难]——分析及代码[Java]

一、题目

给你一个由正整数组成的数组 nums 。
数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。

  • 例如,序列 [4,6,16] 的最大公约数是 2 。

数组的一个 子序列 本质是一个序列,可以通过删除数组中的某些元素(或者不删除)得到。

  • 例如,[2,5,10] 是 [1,2,1,2,4,1,5,10] 的一个子序列。

计算并返回 nums 的所有 非空 子序列中 不同 最大公约数的 数目 。

示例 1:

输入:nums = [6,10,3]
输出:5
解释:不同的最大公约数为 6 、10 、3 、2 和 1 。

示例 2:

输入:nums = [5,15,40,5,6]
输出:7

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 2 * 10^5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-different-subsequences-gcds
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 枚举

(1)思路

根据数学定义,若数字 i 为某子序列的最大公约数,则该序列中的数字,一定都是 i 的倍数。
因此可枚举可能的数字 i ,在 nums 中寻找这些数字的倍数,若它们的最大公约数为 i,说明 i 是某子序列的最大公约数。

(2)代码

class Solution {
    public int countDifferentSubsequenceGCDs(int[] nums) {
        int maxNum = 0, ans = 0;
        for (int num : nums)
            maxNum = Math.max(maxNum, num);
        boolean[] hasNum = new boolean[maxNum + 1];
        Arrays.fill(hasNum, false);
        for (int num : nums)
            hasNum[num] = true;
        
        for (int i = 1; i <= maxNum; i++) {//计算i是否为某子序列的最大公约数
            int gcdNum = 0;
            for (int g = i; g <= maxNum; g += i) {//寻找i的倍数
                if (hasNum[g] == true) {
                    if (gcdNum == 0)
                        gcdNum = g;
                    else
                        gcdNum = gcd(g, gcdNum);//记录当前遍历到i倍数的最大公约数
                    if (gcdNum == i) {//i可以为最大公约数,添加答案
                        ans++;
                        break;
                    }
                }
            }
        }
        return ans;
    }

    public int gcd(int a, int b) {//求最大公约数,默认a>b
        int c;
        while (b > 0) {
            c = a % b;
            a = b;
            b = c;
        }
        return a;
    }
}

(3)结果

执行用时 :58 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :53.8 MB,在所有 Java 提交中击败了 72.11% 的用户。

三、其他

暂无。

标签:Different,Java,GCDs,nums,int,gcdNum,最大公约数,序列
来源: https://blog.csdn.net/zml66666/article/details/115531048

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有