Java教程

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

本文主要是介绍LeetCode——1819. 序列中不同最大公约数的数目(Number of Different Subsequences GCDs)[困难]——分析及代码(Java),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

  • 一、题目
  • 二、分析及代码
    • 1. 枚举
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

给你一个由正整数组成的数组 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% 的用户。

三、其他

暂无。

这篇关于LeetCode——1819. 序列中不同最大公约数的数目(Number of Different Subsequences GCDs)[困难]——分析及代码(Java)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!