题意:给定一个arr数组,能否对半分并重组,使得每对元素满足二倍的关系
n方暴力超时了,得用一下stl的map
class Solution {
public:
bool canReorderDoubled(vector<int> &arr) {
unordered_map<int, int> cnt;
for (int x : arr) {
++cnt[x];//统计每个元素出现次数
}
if (cnt[0] % 2) {
return false;//0如果出现奇数次,必不成立
}
vector<int> vals;
vals.reserve(cnt.size());
for (auto &[x, _] : cnt) {
vals.push_back(x);
}
sort(vals.begin(), vals.end(), [](int a, int b) { return abs(a) < abs(b); });
for (int x : vals) {
if (cnt[2 * x] < cnt[x]) { // 无法找到足够的 2x 与 x 配对
return false;
}
cnt[2 * x] -= cnt[x];
}
return true;
}
};
unordered_map:元素无序,查找速度快,哈希建立费时
map:元素有序自动排序
for(int x:arr) 循环arr数组数据,将数组arr的值循环赋值给x,x=arr[0],,,x=arr[n]
相当于for(int x=arr[i];i<arr.length;i++)
vector的reverse()和resize()
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> vec;
vec.reserve(100);
cout<<"1) vec capacity is "<<vec.capacity()<<endl;
cout<<"1) vec size is "<<vec.size()<<endl;
for(int i=0;i<50;i++)
{
vec.push_back(i+1);
}
cout<<"2) vec capacity is "<<vec.capacity()<<endl;
cout<<"2) vec size is "<<vec.size()<<endl;
vec.resize(105);
cout<<"3) vec capacity is "<<vec.capacity()<<endl;
cout<<"3) vec size is "<<vec.size()<<endl;
for(int i=0;i<5;i++)
{
vec.push_back(100+i);
}
cout<<"4) vec capacity is "<<vec.capacity()<<endl;
cout<<"4) vec size is "<<vec.size()<<endl;
vec.reserve(100);
cout<<"5) vec capacity is "<<vec.capacity()<<endl;
cout<<"5) vec size is "<<vec.size()<<endl;
vec.reserve(200);
cout<<"6) vec capacity is "<<vec.capacity()<<endl;
cout<<"6) vec size is "<<vec.size()<<endl;
char ch[] = "abcdef";
char chh[] = {'a','b','c','d','e','f'};
cout<<"The length of ch is "<<strlen(ch)<<endl;
cout<<"The length of chh is "<<strlen(chh)<<endl;
system("pause");
return 0;
}