題意:給你一個整數(shù)數(shù)組 arr 和一個整數(shù) k ,其中數(shù)組長度是偶數(shù)思瘟,值為 n 荸百。
現(xiàn)在需要把數(shù)組恰好分成 n /?2 對,以使每對數(shù)字的和都能夠被 k 整除滨攻。
如果存在這樣的分法够话,請返回 True ;否則光绕,返回 False 女嘲。
思路:用一個map記下模后值為x的所有數(shù)的個數(shù)。然后遍歷數(shù)組诞帐,每次找到與它配對的值欣尼,map對應(yīng)的值減1。這里需要注意的是負(fù)數(shù)的取模景埃,直接用c++的取模運(yùn)算得到的結(jié)果不符合題意媒至,所以對于負(fù)數(shù)取模重新算一下。a%b = a - 向下取整(a/b) * b;
C++代碼:
class?Solution?{
public:
????map<int,?int>?mp;
????bool?canArrange(vector<int>&?arr,?int?k)?{
????????sort(arr.begin(),?arr.end());
????????for(int?i?=?0;?i?<?arr.size();?i++){
????????????int?tmp?=?arr[i]?%?k;
????????????if(arr[i]?<?0){
????????????????if(arr[i]?/?k?*?k?==?arr[i])?tmp?=?arr[i]?-?arr[i];
????????????????else?tmp?=?arr[i]?-?(arr[i]?/?k?-?1)?*?k;
????????????}
????????????mp[tmp]++;
????????}
????????for(int?i?=?0;?i?<?arr.size();?i++){
????????????int?tmp?=?arr[i]?%?k;
????????????if(arr[i]?<?0){
????????????????if(arr[i]?/?k?*?k?==?arr[i])?tmp?=?arr[i]?-?arr[i];
????????????????else?tmp?=?arr[i]?-?(arr[i]?/?k?-?1)?*?k;
????????????}
????????????if(mp[tmp]?==?0)?continue;
????????????mp[tmp]--;
????????????if(tmp?==?0)?tmp?=?k;
????????????if(mp.find(k?-?tmp)?==?mp.end()?||?mp[k?-?tmp]?==?0){
????????????????return?false;
????????????}
????????????else?if(mp.find(k?-?tmp)?!=?mp.end())?mp[k?-?tmp]--;
????????}
????????return?true;
????}
};