1497. 检查数组对是否能被k整除
💡
原文英文,约600词,阅读约需3分钟。
📝
内容提要
给定一个整数数组和整数k,判断能否将数组分成n/2对,使每对的和能被k整除。算法利用模运算性质:若(a + b) % k == 0,则(a % k + b % k) % k == 0。步骤包括:初始化余数计数数组,遍历数组计算余数,检查配对可能性。若余数0和k/2的计数为偶数,且其他余数i与k-i计数相等,则返回true。时间复杂度为O(n + k),空间复杂度为O(k)。
🎯
关键要点
- 给定一个整数数组和整数k,判断能否将数组分成n/2对,使每对的和能被k整除。
- 算法基于模运算性质:若(a + b) % k == 0,则(a % k + b % k) % k == 0。
- 步骤包括:初始化余数计数数组,遍历数组计算余数,检查配对可能性。
- 初始化余数计数数组,创建长度为k的数组,初始化为零,用于计数。
- 遍历数组,计算每个数的余数并更新计数。
- 检查配对可能性:余数0和k/2的计数必须为偶数,其他余数i与k-i的计数必须相等。
- 时间复杂度为O(n + k),空间复杂度为O(k)。
- 通过计数余数,减少了从O(n^2)到O(n + k)的复杂度。
- 算法能够正确处理负数,并适用于任何正整数k。
❓
延伸问答
如何判断数组能否分成对使每对的和能被k整除?
通过计算每个数的余数并检查配对可能性,如果余数0和k/2的计数为偶数,且其他余数i与k-i的计数相等,则可以分成对。
这个算法的时间复杂度和空间复杂度是多少?
时间复杂度为O(n + k),空间复杂度为O(k)。
如何处理负数以确保余数在正确范围内?
使用((num % k) + k) % k来计算余数,这样可以确保所有余数在[0, k-1]范围内。
为什么需要检查余数0和k/2的计数为偶数?
因为余数0和k/2只能与自身配对,因此它们的计数必须为偶数才能形成有效的配对。
这个算法如何减少复杂度?
通过计数余数,避免了O(n^2)的复杂度,转而使用O(n + k)的复杂度来检查余数配对。
该算法适用于哪些类型的整数k?
该算法适用于任何正整数k。
➡️