🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
一、前K个高频单词
Leetcode 前K个高频单词
第一种思路:用一个map来进行计数,然后用priority_queue优先级队列来进行大堆排序,其中需要自己写仿函数,并且按照字典序的方式进行排序;
class Solution {
public:
struct Less
{
bool operator()(pair<string,int> &p1,pair<string,int> &p2)
{
//字典序排序
if(p1.second<p2.second) return true;
if(p1.second==p2.second&&p1.first>p2.first) return true;
return false;
}
};
vector<string> topKFrequent(vector<string>& words, int k) {
map<string,int> countMap;//int() 0
for(const auto &str:words)
{
countMap[str]++;
}//
vector<string> ret ;
priority_queue< pair<string,int> , vector< pair<string,int> >, Less> pq(countMap.begin(),countMap.end());//自己写仿函数
for(int i=0;i<k;i++)
{
ret.push_back(pq.top().first);
pq.pop();
}
return ret;
}
};
第二种思路,用一个vector来存储放进countMap当中的值,因为map的底层是红黑树,遍历是中序遍历,也是有序的,那么 此时就已经按照字典序的顺序排好了,我们只需要将second进行一个稳定的排序即可
class Solution {
public:
struct Greater
{
bool operator()(pair<string,int> &p1,pair<string,int> &p2)
{
//字典序排序
if(p1.second>p2.second) return true;
return false;
}
private:
};
vector<string> topKFrequent(vector<string>& words, int k) {
map<string,int> countMap;//int() 0
for(const auto &str:words)
{
countMap[str]++;
}//
vector<pair<string,int>> sortV(countMap.begin(),countMap.end());
stable_sort(sortV.begin(),sortV.end());
vector<string> v;
for(int i=0;i<k;i++)
{
v.push_back(sortV[i],first);
}
return v;
}
};
sort底层是快排,不稳定,算法库中有一个stable_sort可以达到稳定排序的效果,并且sort或者stable_sort都只能排序随机迭代器,而map是红黑树,为双向(bidirectional)迭代器
事实上,随机迭代器包含双向迭代器包含单向迭代器
第三种思路:
使用multimap
class Solution {
public:
topKFrequent(vector<string>& words, int k) {
map<string,int> countMap;
for(const auto&str:words)
{
countMap[str]++;
//字典序排序并且记录数目
}
multimap<int,string,greater<int>> sortMap;
for(auto&kv:countMap)
{
sortMap.insert(make_pair(kv,second,kv,first));
//按照key进行排序
}
//...
return v;
}
};
二、两个数组的交集
两个数组的交集
首先将两个容器中的元素去重排序(set),然后两个迭代器来进行遍历
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> st1(nums1.begin(),nums1.end());
set<int> st2(nums2.begin(),nums2.end());
auto it1 = st1.begin();
auto it2 = st2.begin();
vector<int> ret;
while(it1!=st1.end()&&it2!=st2.end())
{
if(*it1 > *it2) it2++;
else if(*it1<*it2) it1++;
else
{
ret.push_back(*it1);
it1++;
it2++;
}
}
return ret;
}
};