【數學】B083_LC_檢查數組對是否可以被 k 整除(檢查成對的餘數 + 處理負數取模)

一、Problem

給你一個整數數組 arr 和一個整數 k ,其中數組長度是偶數,值爲 n 。

現在需要把數組恰好分成 n / 2 對,以使每對數字的和都能夠被 k 整除。

如果存在這樣的分法,請返回 True ;否則,返回 False 。

輸入:arr = [1,2,3,4,5,10,6,7,8,9], k = 5
輸出:true
解釋:劃分後的數字對爲 (1,9),(2,8),(3,7),(4,6) 以及 (5,10) 。

輸入: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

二、Solution

方法一:檢查成對的餘數

思路

數組中要找到 n/2 對匹配的數字對的話,那麼數組中對 k 取模且餘數爲 ii 和對 kk 取模餘數爲 k-i 的數字的個數應該是相等的,比如:

a = [0,1, 2, 3, 4,5],k = 5
0%5 = 0
1%5 = 1
2%5 = 2
3%5 = 3
4%5 = 4
5%5 = 0

cnt[0] % 2 == 0,cnt[1] = cnt[5-1],cnt[2] = cnt[5-3],故該數組合法

細節

如果數字爲負數時,負數取模得到的還會是負數,所以我們要將其轉爲正數

class Solution {
    public boolean canArrange(int[] a, int k) {
    	int m[] = new int[k];
    	for (int x : a) m[(x%k+k)%k]++;

    	for (int i = 1; i < k; i++) if (m[i] != m[k-i])
    		return false;
    	return (m[0] & 1) == 0;
    }
}

我看到還有一些同學是對數組求和然後判斷 % k 是否等於 0 的,這是不對的,比如

[1,1,1,1],k = 4
2%4 = 2
2%4 = 2
無論如何也找不到合法數字對

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(k)O(k)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章