首页 > 其他分享 >1250. 检查「好数组」

1250. 检查「好数组」

时间:2023-04-07 21:58:20浏览次数:46  
标签:gcd nums 复杂度 检查 1250 数组 ans ax

题目链接:1250. 检查「好数组」

方法:最大公约数gcd

裴蜀定理简介

(1)若 \(a,b\) 是整数,且 \(gcd(a,b)=d\),那么对于任意的整数 \(x,y\),\(ax + by\) 都一定是 \(d\) 的倍数,特别地,一定存在整数 \(x,y\),使 \(ax+by=d\) 成立。
(2)推论:\(a,b\) 互质gcd(a,b)=1的充分必要条件是存在整数 \(x,y\) 使 \(ax+by=1\)。

解题思路

(1)对于本题来说,若数组 \(nums\)中,存在 \(gcd(x1, ..., xn)=1,n >= 2\),则原数组为好数组。又因为一旦数组中有子集的 \(gcd=1\),那么整个数组的 \(gcd=1\),两者为充分必要条件。
(2)问题转化:若数组 \(nums\) 中一旦有元素的 \(gcd=1\),则原数组为好数组,否则不是。

代码

class Solution {
public:
    bool isGoodArray(vector<int>& nums) {
        int n = nums.size() - 1, ans = 0;
        while (n >= 0) {
            ans = gcd(ans, nums[n -- ]);
            if (ans == 1) return true;
        }
        return false;
    }
};

复杂度分析

时间复杂度:\(O(n + logM)\),\(n\) 为 \(nums\) 数组的长度,\(M=max(nums)\), 因为其中 \(ans\) 的值单调不增,所以总的 \(gcd\) 时间复杂度为 \(O(logM)\)。;
空间复杂度:\(O(1)\)。

标签:gcd,nums,复杂度,检查,1250,数组,ans,ax
From: https://www.cnblogs.com/lxycoding/p/17297459.html

相关文章

  • 解构赋值(数组与对象都能解构赋值)
    ?就是左边有多个变量名对应赋值给右边的多个值数组的解构赋值还可以实现不用新建空变量名,完成相互换值操作可以给左边的变量名设置默认值,有则选对应,无则选默认值对象的解构赋值数组套对象的解构赋值多级对象解构拿里面对象的值(对象套对象)notice,拿数据的时候,可......
  • JS遍历数组的几种方法
    在JavaScript中,遍历数组有多种方法,下面介绍几种经典方法。for循环用for循环遍历数组是最基础、最原始的方法。constarr=[1,2,3,4,5];for(leti=0;i<arr.length;i++){console.log(arr[i]);}forEach()forEach()是ES5中新增的方法,用来遍历数组,可......
  • C-指针与数组
    指针与数组数组名是一个指向数组中第一个元素的常量指针.数字数组将一个指针指向一个数字数组,指针中存储了数组中第一个元素的地址.intarr1[]={1,2,3};int*p=arr1;printf("%d",*p);//1"指针表示法"printf("%d",p[0]);//1"数组表示法"printf("%d......
  • 6-数组
    1.数组概念:指的是一种容器,可以同来存储同种数据类型的多个值。但是数组容器在存储数据的时候,需要结合隐式转换考虑。比如:​ 定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的,​ 但是byte类型,short类型,int类型的数据是可以存到这个数组里面......
  • Flutter Dart数组固定长度分割成二维数组
    将dart数组按照指定的长度分割,返回一个二维数组,实现list的split功能.例如:a=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]splitList(a,6):[[0,1,2,3,4,5],[6,7,8,9,10,11],[12,13,14,15,16,17],[18,19]] Dart方法代码:......
  • 153. 寻找旋转排序数组中的最小值
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果为数......
  • 用 Go 剑指 Offer 11. 旋转数组的最小数字
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,4,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,4]若旋转7次,则可以得到[0,1,4,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果为数......
  • Java数组
    数组数组的定义数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们.数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的......
  • 数组学习20230407
    今日学习数组:上节课背点:1.三角图输出:上改条件下改值2.外循环控制行,内循环控制列01变量一个数据数组多个同类数据数组/array相同类型数据的组合数组的声明:1.数据类型[]数组名intarr1=newint[]{元素,元素,元素}2.数组类型数组名[]......
  • 题目 1030: [编程入门]二维数组的转置
    题目描述写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。输入格式一个3x3的矩阵输出格式无样例输入复制123456789样例输出复制147258369解题思路:声明两个数组a[3][3],b[3][3],后者存放转置后的元素。先用for循环嵌套输入a数......