num[954. 二倍数对数组]
链接:
二倍数对数组.
思路:
- 把数字放进哈希表里,记录每个数字出现的顺序
- 遍历arr数组的每一个数字
- 如果
arr[i] > 0
,就去哈希表里找m.count(arr[i] * 2)
,没有就return false
,然后减去arr[i]
出现的次数 - 如果
arr[i] < 0
,就去哈希表里找m.count(arr[i] /2)
,没有就return false
,然后减去arr[i]
出现的次数 arr[i]
在哈希表中出现的为负数,也return false
- 之前不理解的地方:之前一直疑惑代码里并没有对及数个零的处理,为什么却对答案不产生影响,原因:传进来的数组是偶数个,如果讯在奇数个零那么必然会有另一个数字找不到解,所以对答案不造成影响
代码:
class Solution {
public:
bool canReorderDoubled(vector<int>& arr) {
map<double, double> m;
for (auto& num : arr) {
m[num]++;
}
for (auto& [c, d] : m) {
if (d < 0) return false;
if (d == 0) continue;
if (c > 0) {
if ( !m.count(c * 2)) return false;
m[c * 2] -= d;
} else {
if (!m.count(c / 2)) return false;
m[c / 2.0] -= d;
}
}
return true;
}
};