建议先过一遍:保研机试前的最后七道链表题-CSDN博客
第一题
82. 删除排序链表中的重复元素 II - 力扣(LeetCode)
是不是似曾相识的感觉,好像数组顺序去重,请看:保研机试前的最后七道数组题-CSDN博客
第二题
1836. 从未排序的链表中移除重复元素 - 力扣(LeetCode)
未排序,有一点难办,只能先遍历一遍链表,可以用unordered_map记录重复元素,再次遍历链表删除重复元素
第三题
264. 丑数 II - 力扣(LeetCode)
嗯..抽象。知乎上的一段话:
简单来说,就是使用一个优先队列(小顶堆)保存所有已生成的丑数,每次取出最小的丑数,然后生成 3 个新的丑数添加到优先队列中重复上述操作。 为了再次巩固priority_queue的用法,我将给出写法。
bool cmp(long long int a,long long int b){
return a>b;
}
class Solution {
public:
int nthUglyNumber(int n) {
priority_queue<long long int,vector<long long int>,decltype(&cmp)> pq(cmp);
unordered_map<long long int,int> hmap;
pq.push(1);
hmap[1]=1;
int cnt=0;
long long int temp=0;
while(cnt<n){
temp=pq.top();
pq.pop();
cnt++;
if(hmap.find(temp*2)==hmap.end()){
pq.push(temp*2);
hmap[temp*2]=1;
}
if(hmap.find(temp*3)==hmap.end()){
pq.push(temp*3);
hmap[temp*3]=1;
}
if(hmap.find(temp*5)==hmap.end()){
pq.push(temp*5);
hmap[temp*5]=1;
}
}
return temp;
}
};
第四题
378. 有序矩阵中第 K 小的元素 - 力扣(LeetCode)
这跟链表有什么关系呢,像不像合并K个升序链表那道题!! omg,恍然大悟
第五题
373. 查找和最小的 K 对数字 - 力扣(LeetCode)
这个正常来说写个结构体,然后sort一下,自己写个cmp函数就好了;或者用小根堆也可以。怎么用呢,还是合并K个升序链表的思想。
bool cmp(vector<int> a,vector<int> b){
return a[0]+a[1]>b[0]+b[1];
}
class Solution {
public:
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
priority_queue<vector<int>,vector<vector<int>>,decltype(&cmp)> pq(cmp);
int len1=nums1.size();
int len2=nums2.size();
for(int i=0;i<len1;i++){
pq.push({nums1[i],nums2[0],0});
}
int cnt=0;
vector<vector<int>> res;
while(cnt<k){
vector<int> temp=pq.top();
pq.pop();
cnt++;
res.push_back({temp[0],temp[1]});
if(temp[2]<len2-1){
pq.push({temp[0],nums2[temp[2]+1],temp[2]+1});
}
}
return res;
}
};
参考:
丑数(Ugly Numbers, Uva 136) - 知乎 (zhihu.com)
【强化练习】链表双指针经典习题 | labuladong 的算法笔记