1497. 检查数组对是否可以被 k 整除
大约 2 分钟
---
1497. 检查数组对是否可以被 k 整除
- 标签:数组、哈希表、计数
- 难度:中等
题目链接
题目大意
描述:给定一个长度为偶数的整数数组 和一个整数 。
要求:判断能否将 分成 对,使得每对元素之和都能被 整除。如果可以,返回 ,否则 。
说明:
- 。
- 。
示例:
- 示例 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) 。解题思路
思路 1:余数计数
1. 核心思想
两个数之和能被 整除,等价于它们的余数之和能被 整除。即 当且仅当 。
对于余数 ,需要与余数 或 (当 时)的元素配对。
2. 具体步骤
第 1 步:统计每个余数的出现次数 ,其中 。
第 2 步:配对检查:
- 余数 的元素必须成对出现,。
- 对于 :
- 如果 ,无法配对,返回 。
- 注意 (即 为偶数且 )时,也需要成对。
第 3 步:全部满足则返回 。
3. 举例说明
以 为例:
余数:
- → 奇数,无法配对 → ( 需要和另一个 配对,但没有)。
以 为例:
余数:
- ✓
- ✓
- ✓
返回 。
思路 1:代码
class Solution:
def canArrange(self, arr: List[int], k: int) -> bool:
count = [0] * k
for x in arr:
r = (x % k + k) % k # 处理负数
count[r] += 1
# 余数为 0 的元素必须成对
if count[0] % 2 != 0:
return False
# 配对余数 r 和 k - r
for r in range(1, k // 2 + 1):
if r == k - r:
if count[r] % 2 != 0:
return False
elif count[r] != count[k - r]:
return False
return True思路 1:复杂度分析
- 时间复杂度:,遍历数组 ,检查配对 。
- 空间复杂度:,余数计数数组。