当前位置: 首页 > news >正文

LeetCode 1250. Check If It Is a Good Array【数论】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

Given an array nums of positive integers. Your task is to select some subset of nums, multiply each element by an integer and add all these numbers. The array is said to be good if you can obtain a sum of 1 from the array by any possible subset and multiplicand.

Return True if the array is good otherwise return False.

Example 1:

Input: nums = [12,5,7,23]
Output: true
Explanation: Pick numbers 5 and 7.
5*3 + 7*(-2) = 1

Example 2:

Input: nums = [29,6,10]
Output: true
Explanation: Pick numbers 29, 6 and 10.
29*1 + 6*(-3) + 10*(-1) = 1

Example 3:

Input: nums = [3,6]
Output: false

Constraints:

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

题意:给出一个正整数数组 nums ,任务是选出 nums 的任一可能子集,将子集中每个元素乘以一个整数并求和,如果和为1,则说明 nums 是个好数组。


视角1 裴蜀定理

本题涉及数论中的裴蜀定理(具体证明可参考「裴蜀定理」百度百科),其内容为:对于不全为零的任意整数 a,ba, ba,b ,记 g=gcd(a,b)g=gcd(a,b)g=gcd(a,b)a,ba,ba,b 的最大公约数,则对于任意整数 x,yx, yx,y 都满足 ax+byax + byax+byggg 的倍数,特别地存在整数 x,yx, yx,y 满足 ax+by=gax+by=gax+by=g 。这应该很好理解,ggga,ba,ba,b 最大公约数,则存在 m,nm,nm,n 满足 mg=a,ng=bmg =a,ng=bmg=a,ng=b ,所以对于任意整数 x,yx,yx,y 都有 ax+by=g(mx+ny)ax+by=g(mx+ny)ax+by=g(mx+ny)ggg 的倍数。

推广到多个整数的情况:对于不全为零的任意整数 a1,a2,…,ana_1,a_2,\dots,a_na1,a2,,an ,记 ggg 为这 nnn 个数的最大公约数,则对于任意 nnn 整数 x1,x2,…,xnx_1,x_2,\dots,x_nx1,x2,,xn 都满足 a1x1+⋯+anxna_1x_1+\dots + a_nx_na1x1++anxnggg 的倍数,特别地存在整数 x1,…,xnx_1,\dots, x_nx1,,xn 满足 a1x1+⋯+anxn=ga_1x_1+\dots +a_nx_n=ga1x1++anxn=g

一个重要推论是:正整数 a1,…,ana_1,\dots,a_na1,,an 的最大公约数是 111(充分必要条件)⇔\Leftrightarrow 存在 nnn 个整数 x1,…,xnx_1,\dots,x_nx1,,xn 满足 a1x1+⋯+anxn=1a_1x_1+\dots+a_nx_n =1a1x1++anxn=1

视角2 辗转相减法

求两个数的最大公因数,可以使用辗转相减法。回忆下述递归过程,不难发现:这一过程压缩后等价于,两个数 a,ba, ba,b 通过同时乘以两个特定整数,再求和可得它们的最大公因数。因此,如果它们的最大公因数为1,则说明存在两个特定整数 x,yx,yx,y 使得 ax+by=1ax+by=1ax+by=1 。反过来说,如果存在两个特定整数 x,yx,yx,y 使得 ax+by=1ax+by=1ax+by=1 ,则 gcd(a,b)=1gcd(a,b)=1gcd(a,b)=1(说明 a,ba,ba,b 通过辗转相减可得1,即 a,ba,ba,b 最大公因数为1)。

int gcd(a, b) {if (a > b) swap(a, b); // 使得a<=bif (a == 0) return b; // 如果a为0,则gcd(0,b)=breturn gcd(a, b - xa); // x是使得xa最大、但xa<=b的某一正整数// b-xa其实就是b%a
}

从而,如果一个互质数组的最大公因数是1,那就一定存在一组整数可以让它们相乘求和得到1。反过来说也可行。

对于 nums 来说,如果存在一个数组子集满足题意(即存在一组整数使它们互乘再求和为1),则说明该数组子集是互质的,从而 nums 一定是互质的。如果 nums 不是互质的,则 nums 就不是好数组。

其他视角

从一些简单的例子入手来思考本题。示例三给的 nums = [3, 6] ,可以先朴素地列出所有的可能性,其子集为 {}, {3}, {6}, {3, 6}

  • 空集显然不符合要求。
  • {3}, {6} 显然也不符合要求。因为对于任意不为1的正整数 xxx ,乘以任意整数 aaa 的结果 axaxax 都不可能为1。当且仅当 x=1x=1x=1 时,才存在唯一的整数 a=1a=1a=1 能使 axaxax 满足 ax=1ax = 1ax=1
  • {3, 6} 也不符合要求。假设 yyyzzz 是任意整数,我们需要找到使得 3y+6z=13y+6z=13y+6z=1 的那对 (y,z)(y, z)(y,z) 。由于 3y+6z=3(y+2z)3y+6z=3(y+2z)3y+6z=3(y+2z) ,而 (y+2z)(y + 2z)(y+2z) 可看作是一个整体的整数,由上一点的分析可知,不存在这样的整数 a=(y+2z)a = (y + 2z)a=(y+2z) 使得 3a=13a = 13a=1 。3是3和6的最大公约数,因此可以大胆猜测最大公约数应在本题中占很重要的位置

因此对两个正整数 a,ba, ba,b ,假设其最大公约数为 ggg 使得 a=mg,b=nga=mg, b=nga=mg,b=ng ,考虑任意整数 x,yx,yx,y ,则 ax+by=g(mx+ny)ax + by=g(mx + ny)ax+by=g(mx+ny) ,可知 mx+nymx+nymx+ny 必定是整数,如要找到某一对 x,yx,yx,y 使得 g(mx+ny)=1g(mx+ny)=1g(mx+ny)=1 成立,则唯一的可能性是 g=1g=1g=1(mx+ny)=1(mx+ny)=1(mx+ny)=1 。也就是 a,ba,ba,b 的最大公因数必须是1。

解法 数论

由裴蜀定理可得,题意等价于:如果 nums 中全部整数的最大公约数为1(即为互质数组),则 nums 为好数组。否则不是。

class Solution:def isGoodArray(self, nums: List[int]) -> bool:return reduce(gcd, nums) == 1

相关文章:

LeetCode 1250. Check If It Is a Good Array【数论】

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

ETHDenver 2023

ETHDenver是全球最大、持续时间最长的以太坊活动之一&#xff0c;今年的活动定于2月24日至3月5日在美国科罗拉多州丹佛市盛大举行。这次活动将面向以太坊和其他区块链协议爱好者、设计者和开发人员。Moonbeam作为ETHDenver 2023的Meta赞助商&#xff0c;将在本次活动中展示令人…...

React架构演变

老版React架构 React 16之前的架构 其实就分为两个部分&#xff1a; Reconciler协调器Render渲染器 Reconciler协调器负责本次更新有什么组件需要被渲染&#xff0c;diff算法就发生在这个步骤中&#xff0c;在diff算法中会将上次更新的组件和本次更新的组件做一个对比&…...

安全认证--JWT介绍及使用

安全认证--JWT介绍及使用1.无状态登录原理1.1.什么是有状态&#xff1f;1.2.什么是无状态1.3.如何实现无状态1.4.JWT1.4.1.简介1.4.2.数据格式2.编写JWT工具2.1.添加JWT依赖2.2.载荷对象2.3.工具2.4.测试2.4.1.配置秘钥2.4.2.测试类1.无状态登录原理 有状态登录和无状态登录详…...

【计算机组成原理】计算机硬件的基础组成、认识各个硬件部件

计算机组成原理&#xff08;一&#xff09; 计算机内部是通过电信号传递数据 电信号&#xff1a;分为高电平和低电平&#xff0c;分别代表1/0 数字、文字、图像如何用二进制表示? CPU如何对二进制数进行加减乘除? 如何存储这些二进制数的? 如何从内存中取出想要的数…...

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cuttag等富集峰的基因组注释

二代测序产生的数据类型 常规的下一代高通量测序&#xff08;next generation sequencing, NGS&#xff09;实验通常产生大量短片段(reads)&#xff0c;通常我们需要将这些reads比对到参考基因组/转录组上&#xff0c;即将它们置于生物学上有意义的基因背景下&#xff0c;才能…...

第九届蓝桥杯省赛——7缩位求和

题目&#xff1a;在电子计算机普及以前&#xff0c;人们经常用一个粗略的方法来验算四则运算是否正确。比如&#xff1a;248 * 15 3720把乘数和被乘数分别逐位求和&#xff0c;如果是多位数再逐位求和&#xff0c;直到是1位数&#xff0c;得2 4 8 14 > 1 4 5;1 5 65…...

【c++】STL常用容器5—list容器

文章目录list基本概念list构造函数list赋值和交换list大小操作list插入和删除list数据存取list反转和排序list基本概念 功能&#xff1a;将数据进行链式存储。 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链…...

【牛客刷题专栏】0x0D:JZ5 替换空格(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…...

聚观早报 | 苹果2024年放弃高通;腾讯回应进军类 ChatGPT

今日要闻&#xff1a;苹果2024年放弃高通&#xff1b;腾讯回应进军类 ChatGPT&#xff1b;小米发布无线AR眼镜探索版&#xff1b;50%的美国企业已在使用ChatGPT&#xff1b;Snap推出ChatGPT驱动的聊天机器人 苹果2024年放弃高通 高通公司 CEO 兼总裁克里斯蒂亚诺・安蒙&#xf…...

Elasticsearch:如何正确处理 Elasticsearch 摄取管道故障

在我之前的文章 “Elastic&#xff1a;开发者上手指南” 中的 “Ingest pipeline” 章节中个&#xff0c;我有很多文章是关于 ingest pipeline 的。在今天的文章中&#xff0c;我将重点介绍如何处理在摄取管道中的错误。在我之前的文章 “Elasticsearch&#xff1a;如何处理 in…...

指标体系—北极星指标体系

北极星指标体系 每个产品都有很多指标,每个指标都反映了对应业务的经营情况。但是在实际业务经营中,却要求我们在不同的产品阶段寻找到合适的指标,让这个指标可以代表当前产品阶段的方向和目标,让这个指标不仅对业务经营团队,而且对产品的用户、对产品的价值都能有很好的…...

【操作系统】内存管理

虚拟内存 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存&#xff0c;从而让程序获得更多的可用内存。 为了更好的管理内存&#xff0c;操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间&#xff0c;这个地址空间被分割成多个块&#xff0c;每一块称为一页。…...

家庭消耗品跟踪管理软件HomeLists

什么是 HomeLists &#xff1f; HomeLists 是一款自托管耗材统计软件&#xff0c;能通过提醒等帮助您跟踪家庭消耗品。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 homelists &#xff0c;选择第一个 aceberg/homelists&#xff0c;版本选择 latest。 本文写作时&…...

django模型简要(1)

1. AbstractUser(内置用户模型类)的使用 ### 需要在settings.py中添加如下&#xff1a; AUTH_USER_MODEL app.MyUser 说明&#xff1a;这是为了覆盖django默认的User model&#xff1b;app即模型所属app&#xff0c;MyUser即AbstractUser实现类。 2.on_delete选项 从django3.…...

【shell 编程大全】sed详解

sed详解1. 概述 今天单独拉出一章来讲述下sed命令。因为sed命令确实内容太多&#xff0c;不过也是比较灵活的&#xff0c;好了不废话了。我们开始吧 1.2 原理解析 shell脚本虽然功能很多&#xff0c;但是它最常用的功能还是处理文本文件&#xff0c;尤其是在正常的业务操作流程…...

关于sudo配置

前言这里做一个小补充&#xff0c;主要讲一下关于利用sudo对指令提权以及普通用户无法使用sudo指令的问题。在前面的文章【Linux】一文掌握Linux权限中&#xff0c;我们讲到了关于权限的一些问题。我们知道root身份下&#xff0c;一切畅通无阻&#xff0c;而权限只是用来限制我…...

EEGLAB处理运动想象脑电数据

最近在看论文时&#xff0c;经常看到作者处理数据的过程&#xff0c;之前都是一代而过&#xff0c;知道怎么处理就可以了&#xff0c;一直没有实践&#xff0c;最近需要一些特殊的数据&#xff0c;需要自己处理出来&#xff0c;这里尝试着自己用MATLAB处理数据&#xff0c;记录…...

span标签的使用场景

目录 前言 一、span标签是什么&#xff1f; 二、span常用 1.可以嵌套a标签。 2.直接使用 3.加样式使用 4.加按钮使用 5.加a标签的综合使用 6.跟table结合使用 总结 前言 本篇章主要记录一下开发日常中&#xff0c;所常遇见的使用span标签的场景。 一、span标签是什么…...

Kafka面试问题总结

kafka架构2.基础概念Producer&#xff08;生产者&#xff09; : 产生消息的一方。Consumer&#xff08;消费者&#xff09; : 消费消息的一方。Broker&#xff08;代理&#xff09; : 可以看作是一个独立的 Kafka 实例。多个 Kafka Broker 组成一个 Kafka Cluster。同时&#x…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...