Description
Given an array of integers arr of even length n and an integer k.
We want to divide the array into exactly n / 2 pairs such that the sum of each pair is divisible by k.
Return True If you can find a way to do that or False otherwise.
Example 1:
Input: arr = [1,2,3,4,5,10,6,7,8,9], k = 5
Output: true
Explanation: Pairs are (1,9),(2,8),(3,7),(4,6) and (5,10).
Example 2:
Input: arr = [1,2,3,4,5,6], k = 7
Output: true
Explanation: Pairs are (1,6),(2,5) and(3,4).
Example 3:
Input: arr = [1,2,3,4,5,6], k = 10
Output: false
Explanation: You can try all possible pairs to see that there is no way to divide arr into 3 pairs each with sum divisible by 10.
Example 4:
Input: arr = [-10,10], k = 2
Output: true
Example 5:
Input: arr = [-1,1,-2,2,-3,3,-4,4], k = 3
Output: true
Constraints:
- arr.length == n
- 1 <= n <= 10^5
- n is even.
- -10^9 <= arr[i] <= 10^9
- 1 <= k <= 10^5
分析
题目的意思是:给你一个数组,要求把数两两组合能否全部被K整除。一开始没什么思路,看了提示以后,发现可以构造一个长度为k的数组fre,遍历arr,统计arr里面每一个值和k取余的值的频率。然后再遍历fre,对于第0个位置,频率应该是偶数,其他位置用双指针法来判断两边的频率是否相等,如果全相等则返回True,否则返回False。如果能想到构造取余的频率数组,就能够做出来。
代码
class Solution:
def canArrange(self, arr: List[int], k: int) -> bool:
n=len(arr)
fre=[0]*k
for num in arr:
t=num%k
fre[t]+=1
i=1
j=k-1
if(fre[0]%2!=0):
return False
while(i<=j):
if(fre[i]!=fre[j]):
return False
else:
i+=1
j-=1
return True