刷爆力扣之检查数组对是否可以被 k 整除

news2025/7/12 11:40:43

刷爆力扣之检查数组对是否可以被 k 整除

HELLO,各位看官大大好啊,我是阿呆 🙈🙈🙈
今天开始阿呆将会记录下力扣刷题过程,收录在专栏算法中 😜😜😜

在这里插入图片描述

该专栏按照不同类别标签进行刷题,每个标签又分为 Easy、Medium、Hard 三个等级 🥳🥳🥳

本部分所有题目均来自于LeetCode 网,并于每道题目下标明具体力扣网原题链接 🏃🏃🏃

OK,兄弟们,废话不多直接上题,冲冲冲 🌞🌞🌞


一 🏠 题目描述

1497. 检查数组对是否可以被 k 整除

给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n

现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除

如果存在这样的分法,请返回 True ;否则,返回 False

示例 1:

输入:arr = [1,2,3,4,5,10,6,7,8,9], k = 5
输出:true
解释:划分后的数字对为 (1,9),(2,8),(3,7),(4,6) 以及 (5,10) 

示例 2:

输入:arr = [1,2,3,4,5,6], k = 7
输出:true
解释:划分后的数字对为 (1,6),(2,5) 以及 (3,4)

示例 3:

输入:arr = [1,2,3,4,5,6], k = 10
输出:false
解释:无法在将数组中的数字分为三对的同时满足每对数字和能够被 10 整除的条件

提示:

  • arr.length == n

  • 1 <= n <= 105

  • n 为偶数

  • -109 <= arr[i] <= 109

  • 1 <= k <= 10

二 🏠破题思路

2.1 🚀 关键信息

解决问题第一步,当然先提取题目字面上的关键信息 😎😎😎

把数组恰好分成 n / 2 对 = 即把数组中的元素两两一对进行分组

每对数字和能被 k 整除 = 每组的元素之 sum 对 k 取模结果都为 0 (sum % k = 0)

提取完题目中的关键信息后,直接进入第二阶段,思路整理 😃😃😃

2.2 🚀 思路整理

如果两个数之和能被 k 整除,那这两个数对 k 取模的结果之和也能被 k 整除,这是这道算法题的核心点

那么对于任意的一个数,对 k 取模后记为 Xk,分为以下两种情况

1、若 Xk1 = 0,需找到另一个满足 Xk2 = 0 的数进行配对

2、若 Xk1 > 0,需找到另一个满足 Xk1 + Xk2 = k 的数进行配对


于是可以很容易联想到使用哈希表记录取模结果。对于哈希表的 KEY 表示一个数的余数,VAL 表示这个余数出现的次数。统计完成后,将所有条目进行配对,确保如下两条

1、哈希映射中键 0 对应的值为偶数,对应如上第一种情况

2、哈希映射中键 t (t>0) 和键 k - t 对应的值相等,对应如上第二种情况


小细节

在 C++ 中,将负数 x 对一个正数 k 进行取模操作,得到的结果小于等于 0,即在 [−k+1,0] 范围内 。我们可以通过:xk = (x % k + k) % k ,得到在 [0, k-1] 的范围内的余数 👀👀👀

由于哈希映射中的键的范围为 [0, k-1],因此我们可以使用一个长度为 k 的数组代替哈希表,降低编码难度

整理完解题思路后,直接进入第三阶段,代码实现 😃😃😃

三 🏠 代码详解

3.1 🚀 代码实现

按照我们刚才的破题思路,直接代码走起来 👇👇👇👇

bool canArrange(std::vector<int>& arr, int k) {
   
    std::vector<int> mod(k); //定义取模数组代替哈希表 ,对应小细节 ②
    for (int num: arr) { //遍历输入数组 arr
        ++mod[(num % k + k) % k]; //对输入数组元素进行取模操作,并对其进行计数
    }
    
    for (int i = 1; i + i < k; ++i) { //遍历取模数组
        if (mod[i] != mod[k - i]) return false; //若不满足第二种配对情况直接 return
    }
    return mod[0] % 2 == 0; //校验是否满足第一种配对情况
}

3.2 🚀 细节解析

看完 👀👀👀 全注释版的代码实现后,相信看官大大对整体逻辑已经是大写的 OK 了 😃😃😃

那么我们挖掘上述实现的晦涩细节 😖😖😖 进行解析,直接开干,走起来 👇👇👇👇

++mod[(num % k + k) % k]; //对输入数组元素进行取模操作,并对其进行计数

首先是 (num % k + k) % k ,它对应着小细节 ①,我们这里举出一个例子解释, 例 x = - 1, k = 5

注:以下 y,z 范围为 ( - k,k ),参考 2.2 思路整理

如果满足 (x + y) % k = 0,易得 y = 1

那么 1 对应的正整数满足表达式(1 + z ) % = 0 ,易得 z = 4

因此我们可以得对于数字 y = 1 , x = - 1 和 z = 4 对于(x + y) % k = 0 表达式完全等效

其次是 ++mod[N],这实际就是利用了数组下标作为哈希表的 KEY ,索引值作为哈希表 VAL 在计数而言

i + i < k //遍历取模数组

遍历取模数组的循环条件是否可以写成 i < k ?

当然可以,但是实际上这仅需遍历一半足矣,因为是在拿元素值进行配对比较嘛,这样的效率高 😜😜😜

遍历取模数组的循环条件是否可以写成 i < k / 2 ?

不可以,因为 i 为整型 i + i < ki < k / 2 并不等效,例如 i = 1,k = 3 ,前者表表达式结果为 TRUE ,后者表达式结果为 FALSE 😖😖😖

四 🏠 心路历程

为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈

博主在第一阶段提取 🚀 关键信息并没有问题,在第二阶段 🚀 思路整理中只想到了对任意元素,对 k 取模后可以简化配对过程,但是并没有联想到两种配对情况 😭😭😭 (破题关键点)

所以博主的这道题也是在阅读完官方解析后,解出来并加以记录的


五 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

如果各位看官大大觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CPU调度

目录 1.进程调度 1.1 工作负载简化假设 1.2 调度指标&#xff1a;周转时间 1.3 先进先出&#xff08;FIFO&#xff09; 1.4 最短任务优先&#xff08;SJF&#xff09; 1.5 最短完成时间优先&#xff08;STCF&#xff09; 1.6 新度量指标&#xff1a;响应时间 1.7 轮转 …

【网页设计】基于HTML+CSS+JavaScript制作美食网站舌尖上的美食

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

基于因果化评论的可解释推荐方法

ChineseCSCW2022&#xff08;太原&#xff09;会议&#xff0c;汇报来自复旦大学张光平同学&#xff0c;本篇文章为会议记录&#xff0c;如有侵权&#xff0c;请联系我删除‼️ 目录 1.引言 2.背景 3.模型结构 4.方法论 5.预测和训练 6.实验 1.引言 2.背景 共线关系…

[附源码]SSM计算机毕业设计社区医院管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

记录报错_linux: su root 报错: su: Authentication failure

记录报错_linux: su root 报错&#xff1a; su: Authentication failure初su: Authentication failure关于 su 用法 &#xff1a;常用下图为使用其他用户进行命令 ls 操作下图为变更用户操作&#xff1a;初 希望能写一些简单的教程和案例分享给需要的人 su: Authentication f…

智慧会议解决方案-最新全套文件

智慧会议解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧会议全套最新解决方案合集一、建设背景 从白板到PPT投影演示&#xff0c;现代会议已变得越发生动。随着移动设备和智能终端的出现&#xff0c; 会议实现了由“书纸”向“屏幕”跃迁&#xf…

大学生阅读小说网页设计模板代码 小说书籍网页作业成品 学校书籍网页制作模板 学生简单书籍阅读网站设计成品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

文献解读——基于深度学习的病毒宿主预测

文章目录背景介绍作者介绍文章概述流程数据准备输入数据处理深度神经网络结果背景介绍 人畜共患病病毒对人类和动物的健康产生巨大了威胁&#xff0c;例如近期爆发的寨卡病毒、埃博拉病毒以及冠状病毒。病毒起源的宿主信息对于有效控制和消灭传播是至关重要的&#xff0c;这是…

Linux——【ftp环境搭建】

前言 FTP&#xff08;File Transfer Protocol&#xff09;是文件传输协议&#xff0c;主要是用来进行文件的传输&#xff0c;尤其是大型文件的传输使用 FTP 更是方便。比如在RedHat Enterprise Linux操作系统中&#xff0c;用户可以在RHEL服务器上建立一个FTP服务器&#xff0…

v-model的修饰符

1.lazy修饰符 输入框失去光标跳动&#xff0c;即失焦状态&#xff0c;或者敲击回车时&#xff0c;输入框的值才动态绑定&#xff0c;以此减少过度频繁的绑定 <div id"app"> <!-- 1.lazy--><input type"text" v-model.lazy"message&q…

Node.js 入门教程 12 使用 Node.js 输出到命令行

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程12 使用 Node.js 输出到命令行12.1 使用控制台模块的基础输出12.2 清空控制台12.3 元素计数12.4 打印堆栈踪迹12.5 计算耗时…

基因组 组装教程 (T2T)

导读 本文将介绍T2T基因组&#xff0c;并提供一份基因组组装的资料&#xff0c;其中包含&#xff1a;基因组组装数据和组装策略介绍&#xff1b;染色体水平基因组组装&#xff1b;基因组补洞&#xff1b;着丝粒和端粒分析等&#xff0c;获取方式见文末。 简介[1] 随着物种基因组…

vscode平台上通过Embedded IDE搭建单片机开发环境

软件安装 安装vscode&#xff0c;具体下载连载如下 [vscode官网下载地址](https://code.visualstudio.com/Download)更改vscode插件安装位置 在C:\Users\13547.vscode\路径中找到extensions&#xff0c;并右键点击extensions文件夹然后点击剪切&#xff0c;这里必须是剪切而不…

Jenkins 构建Maven 项目

Jenkins中自动构建项目的类型有很多&#xff0c;常用的有以下三种&#xff1a; 自由风格软件项目&#xff08;FreeStyle Project&#xff09;Maven项目&#xff08;Maven Project&#xff09;流水线项目&#xff08;Pipeline Project&#xff09; 每种类型的构建其实都可以完成…

Python 中导入csv数据的三种方法

这篇文章主要介绍了Python 中导入csv数据的三种方法,内容比较简单&#xff0c;非常不错&#xff0c;具有一定的参考借鉴价值&#xff0c;需要的朋友可以参考下微点阅读小编收集的文章介绍。 Python 中导入csv数据的三种方法&#xff0c;具体内容如下所示&#xff1a; 1、通过…

4、python中函数、匿名函数、递归函数

文章目录函数的创建和调用空函数变量的作用域全局变量局部变量函数内部修改全局变量函数参数传递参数检查常见的4类形参必选参数默认参数可变参数--*args接收的是一个元组关键字参数--**kwargs接收的是一个字典匿名函数练习题&#xff0c;将整型数组的0移动到末尾递归函数求n的…

软件测试 -- 进阶 4 软件测试策略

巧而好度&#xff0c;必攻&#xff1b;勇而好问&#xff0c;必胜&#xff1b;智而好谋&#xff0c;必成。-- 《孔子家语》 翻译&#xff1a;灵巧而有擅长揣摩的人&#xff0c;必定坚定&#xff1b;勇敢而有擅长请教的人&#xff0c;必定取胜&#xff1b;富有智慧而有擅长谋…

Linux系统配置及服务管理-07-文件系统及RAID

文件系统详解 EXT4文件系统 EXT4是第四代扩展文件系统&#xff08;Fourth extended filesystem) 类型&#xff1a;索引(index ) 文件系统 系统限制&#xff1a; Ext3&#xff1a; 文件系统最大16TBExt4&#xff1a; 文件系统最大16TBXFS : 文件系统最大100TB. 名词 inod…

进程间通信之匿名管道和命名管道

目录 管道是什么 匿名管道 命名管道 命名管道创建方式 管道的特点&#xff1a; 管道是什么 概念&#xff1a;管道是计算机通信领域设计者&#xff0c;设计出的一种单向通信的方式&#xff0c;linux原生提供管道通信 管道都是单向传输内容的 管道中传输的都是"资源&…

SSM_整合篇

一、整合步骤 1.1 数据表的介绍 team表&#xff1a; player表&#xff1a; 1.2 创建maven项目 1.3 pom.xml引入jar依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"…