題目連結:
題目意譯:
給定一個長度為一偶數 n 的整數陣列 arr 以及一整數 k。
我們想要將該陣列分成恰好 n / 2 個數對使得每一個數對之總和值可以被 k 整除。
如果你可以找到這樣子的分組方式,則回傳真(True);反之,回傳假(False)。
限制:
arr.length == n
1 ≦ n ≦ 10 ^ 5
n 是偶數。
-10 ^ 9 ≦ arr[i] ≦ 10 ^ 9
1 ≦ k ≦ 10 ^ 5
範例測資:
範例 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
解釋: 你可以窮舉出所有可能的數對來看到不可能將 arr 分成 3 個數對使得每一對各自的總和可以被 10 整除。
解題思維:
將 arr 中的數字先按照除以 k 的餘數分類。
可以看到餘數為 0 的數字只能跟其他餘數為 0 的數字配(不然總和不可能為 k 的倍數)。因此如果餘數為 0 的數字之個數是奇數,則不可能找到所求的分組方式。
同樣地,可以看到餘數恰好為 k / 2 的數字也只能跟其他的餘數恰好為 k / 2 的數字配(可以看到此時 k 是一個偶數)。因此同樣地如果餘數恰好為 k / 2 的數字之個數是奇數,則一樣不可能找到所求的分組方式。
而剩餘其他餘數值 r 的數字則需要跟餘數 k - r 的數字配對。因此如果有任何餘數值 r 滿足,餘數為 r 的數字個數不等於餘數為 k - r 的數字個數,則又是不可能找到所求的分組方式。
而最後如果通過了以上判斷之後都沒事,則代表我們可以找到一組分組方式滿足題目的條件。因此回傳真;反之,則回傳假。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。