一、题目
给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤:
从 nums 选出 两个 相等的 整数
从 nums 中移除这两个整数,形成一个 数对
请你在 nums 上多次执行此操作直到无法继续执行。
返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-number-of-pairs-in-array/description/
二、C++解法
我的思路及代码
由于题目限制,数字的范围是0-100,所以可以直接创建一个大小为101的布尔型数组来做标志位。遇到一次数字就把该数字对应下标的标志位取反,然后判断标志位就可以得到有几对数。最后数组中剩下的数字的个数就是原来数组的长度减去配对成功的对数的两倍。
class Solution {
public:
vector<int> numberOfPairs(vector<int>& nums) {
vector<int> ans={0,0};
bool arr[101]={false};
ans[1] = nums.size();
for(int item : nums){
arr[item]=!arr[item];
if(!arr[item])
ans[0]++;
}
ans[1]-=2*ans[0];
return ans;
}
};
- 时间复杂度:O(n),其中 n 是数组的长度。需要遍历一次数组。
- 空间复杂度:O(n)。标志位数组中最多保存 n 个元素。
官方参考代码
class Solution {
public:
vector<int> numberOfPairs(vector<int>& nums) {
unordered_map<int, bool> cnt;
int res = 0;
for (int num : nums) {
if (cnt.count(num)) {
cnt[num] = !cnt[num];
} else {
cnt[num] = true;
}
if (!cnt[num]) {
res++;
}
}
return {res, (int)nums.size() - 2 * res};
}
};
- 时间复杂度:O(n),其中 n 是数组的长度。需要遍历一次数组。
- 空间复杂度:O(n)。哈希表中最多保存 n 个元素。