1. 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
class Solution {
public:
set<int> s;
int singleNumber(vector<int>& nums) {
for (auto it: nums) {
if (!s.erase(it)) {
s.insert(it);
}
}
return *s.begin();
}
};
C++知识:
vector中erase
-
iterator erase(iterator position);
-
iterator erase(iterator first, iterator last);
map中erase
- void erase (iterator position);
- size_type erase (const key_type& k);//返回删除的个数
- void erase (iterator first, iterator last);
set中erase
- iterator erase (const_iterator position);
- size_type erase (const value_type& val);
- iterator erase (const_iterator first, const_iterator last);
multimap也在map头文件里
unordered_map在unordered_map头文件里
2. 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
class Solution {
public:
map<int, int> m;
int majorityElement(vector<int>& nums) {
for (auto it: nums) {
if (m.count(it)) {
m[it]++;
} else {
m[it] = 1;
}
}
int l = nums.size() / 2;
for (auto it: m) {
if (it.second > l) {
return it.first;
}
}
return -1;
}
};