概述
题目
给你一个整数数组 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 整除的条件。
示例 4:
输入:arr = [-10,10], k = 2
输出:true
示例 5:
输入:arr = [-1,1,-2,2,-3,3,-4,4], k = 3
输出:true
提示:
arr.length == n
1 <= n <= 10^5
n 为偶数
-10^9 <= arr[i] <= 10^9
1 <= k <= 10^5
分析
万万没想到本题是数学类题目。主要思路是:定义数组 mod,mod[i] 存模值为 i 的元素的个数,然后看 mod[i] 和 mod[k - i] 的个数是否相等,如果不相等就不能相配。对于 mod[0] ,检查是否为偶数。
再复习一下 取模(mod) 和取余 的区别。
简单点说:取余运算(Java 中为 %)在求商时向 0 舍弃小数位;而取模运算(Java 中为 Math.floorMod()) 在求商时向负无穷舍弃小数位。
如:4 / -3 = -1.33333...., 如果计算 4 % (-3), 向 0 舍弃小数位,商为 -1,取余结果:4 - (-1) * (-3) = 1;如果计算 Math.floorMod(4, -3), 向负无穷舍弃小数位,商为 -2,取模结果:4 - (-2) * (-3) = -2。数学中说的模就是 Math.floorMod()。
代码
class Solution {
public boolean canArrange(int[] arr, int k) {
int[] mod = new int[k];
for (int i = 0; i < arr.length; i++) {
mod[Math.floorMod(arr[i], k)]++;
}
for (int i = 1; i < k / 2; i++) {
if (mod[i] != mod[k - i]) return false;
}
return (mod[0] & 1) == 0;
}
}
最后
以上就是明亮钥匙为你收集整理的Leetcode: 1497. 检查数组对是否可以被 k 整除的全部内容,希望文章能够帮你解决Leetcode: 1497. 检查数组对是否可以被 k 整除所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复