网站建设的流程图示,wordpress不同背景图片,帮别人做设计图的网站,沈阳有什么服务网站来源#xff1a;力扣#xff08;LeetCode#xff09;
描述#xff1a;
给你一个正整数数组 nums#xff0c;你需要从中任选一些子集#xff0c;然后将子集中每一个数乘以一个 任意整数#xff0c;并求出他们的和。
假如该和结果为 1#xff0c;那么原数组就是一个「…来源力扣LeetCode
描述
给你一个正整数数组 nums你需要从中任选一些子集然后将子集中每一个数乘以一个 任意整数并求出他们的和。
假如该和结果为 1那么原数组就是一个「好数组」则返回 True否则请返回 False。
示例 1
输入nums [12,5,7,23]
输出true
解释挑选数字 5 和 7。
5*3 7*(-2) 1示例 2
输入nums [29,6,10]
输出true
解释挑选数字 29, 6 和 10。
29*1 6*(-3) 10*(-1) 1示例 3
输入nums [3,6]
输出false提示
1 nums.length 1051 nums[i] 109
前言
方法数论
思路与算法 本题解涉及到数论中的「裴蜀定理」,题目给出一个正整数数组 nums现在我们需要从中任选一些子集然后将子集中的每一个数都乘以一个任意整数并求出他们的和如果该和的结果为 1那么原数组就是一个「好数组」。现在我们需要判断数组 nums 是否是一个「好数组」。由「裴蜀定理」可得题目等价于求 nums 中的全部数字的最大公约数是否等于 1若等于 1 则原数组为「好数组」否则不是。 求 nums 中全部数字的最大公约数的方法为我们设初始为 x nums[0]然后对于每一个数 nums[i]0 i n我们更新 x gcd(x, nums[i])。遍历完全部数字后x 即为数组 nums 中全部的元素的最大公约数。然后判断其是否等于 1 即可。在实现过程中我们也可以进一步做优化如果遍历过程中出现最大公约数等于 1 的情况则由于 1 和任何正整数的最大公约数都是 1此时可以提前结束遍历。
代码
class Solution {
public:bool isGoodArray(vectorint nums) {int divisor nums[0];for (int num : nums) {divisor gcd(divisor, num);if (divisor 1) {break;}}return divisor 1;}
};执行用时40 ms, 在所有 C 提交中击败了70.90%的用户 内存消耗28.4 MB, 在所有 C 提交中击败了82.09%的用户 复杂度分析 时间复杂度O(nlogm)其中 n 为数组 nums 的长度m 为数组 nums 中的最大数其中求单次最大公约数的时间复杂度为 O(logm)由于在每次求两个数的最大公约数时其中一个数保持单调不增所以求总的公约数的时间复杂度为 O(logm)。 空间复杂度O(1)。仅使用常量空间。 authorLeetCode-Solution