Leetcode.1250 检查「好数组」
题目链接
Leetcode.1250 检查「好数组」 Rating : 1983
题目描述
给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。
假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True
;否则请返回 False
。
示例 1:
输入:nums = [12,5,7,23]
输出:true
解释:挑选数字 5 和 7。
53 + 7(-2) = 1
示例 2:
输入:nums = [29,6,10]
输出:true
解释:挑选数字 29, 6 和 10。
291 + 6(-3) + 10*(-1) = 1
示例 3:
输入:nums = [3,6]
输出:false
提示:
- 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
- 1 < = n u m s [ i ] < = 1 0 9 1 <= nums[i] <= 10^9 1<=nums[i]<=109
分析:
解决本题需要学习下 裴蜀定理(Bézout’s identity)。
多个整数之间的裴蜀定理
设 a 1 . . . . a n a_1....a_n a1....an 共 n n n 个整数, d d d 是这个 n n n个数的最大公约数,那么就肯定存在 x 1 . . . . x n x_1....x_n x1....xn 使得 a 1 ∗ x 1 . . . a n ∗ x n = d a_1 * x_1...a_n * x_n = d a1∗x1...an∗xn=d。
特殊的情况是,只要当 a 1 . . . a n a_1...a_n a1...an 中有存在两个或以上的数互质,那么就一定存在 x 1 , x 2 . . . x n x_1,x_2...x_n x1,x2...xn 使得 a 1 ∗ x 1 + a 2 ∗ x 2 . . . a n ∗ x n = 1 a_1 * x_1 + a_2 * x_2...a_n * x_n = 1 a1∗x1+a2∗x2...an∗xn=1。
时间复杂度: O ( n l o g m ) O(nlogm) O(nlogm)
代码:
class Solution {
public:
//求 a 和 b 的最大公约数
int gcd(int a,int b){
return b ? gcd(b,a%b) : a;
}
bool isGoodArray(vector<int>& nums) {
int g = 0;
for(auto x:nums){
g = gcd(g,x);
//g == 1 说明 nums 中一定存在两个数以上的互质
if(g == 1) break;
}
return g == 1;
}
};
相关文章
- [LeetCode] Move Zeroes - 整数数组处理问题
- ajax传递数组,后台更新
- 把数组排成最小数
- Java实现LeetCode 5449. 检查数组对是否可以被 k 整除 (更改题意)
- Java实现 LeetCode 706 设计哈希映射(数组+链表)
- 列表 数组 哈希表
- (剑指Offer)面试题29:数组中出现次数超过一半的数字
- Python检查数组元素是否存在类似PHPisset()方法
- 使用冒泡排序对一维数组进行排序
- LeetCode-1250. 检查「好数组」【数论,裴蜀定理】
- 34. 在排序数组中查找元素的第一个和最后一个位置
- 一维数组、二维数组
- 2150. 找出数组中的所有孤独数字-快速排序
- 无序数组的中位数
- 【SystemVerilog 之 激励发生的随机化】~ 随即约束和分布、约束块控制、随机函数、数组约束、随机控制
- PHP转Go系列:数组与切片 转
- 9.IDA-重新设置函数类型、创建数组结构
- Numpy tips: 如何检查一个numpy数组是否全0?