LeetCode刷题笔记-数据结构-day2
Posted LL.LEBRON
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题笔记-数据结构-day2相关的知识,希望对你有一定的参考价值。
文章目录
LeetCode刷题笔记-数据结构-day2
75.颜色分类
1.题目描述
原题链接:75. 颜色分类
2.解题思路
算法:双指针算法
题目要求:不使用内置排序函数。使用常数空间
具体思路:
-
假设数组长度为
n
。使用三个指针i、j、k
,初始化i=0、j=n-1、k=0
-
从
k
开始遍历,分三种情况:-
如果
a[k]==0
。swap(a[i++],a[k++]);
这里
a[i]
一定是不等于2
的。因为如果等于2
,会执行第二种操作,所以不可能为2
。所以
a[i]==1,a[k]==0
,因此交换后,i
和k
都可以往后移一位 -
如果
a[k]==2
。swap(a[j--],a[k]);
因为这里
a[j]
的值可能也是2
,所有这里k
交换后不能往后移。 -
如果
a[k]==1
。k++;
-
3.代码
class Solution
public:
void sortColors(vector<int>& a)
int n=a.size();
int i=0,j=n-1,k=0;
while(k<=j)
if(a[k]==0) swap(a[i++],a[k++]);
else if(a[k]==2) swap(a[j--],a[k]);
else k++;
;
56.合并区间
1.题目描述
原题链接:56. 合并区间
2.解题思路
直接套用区间合并的模板即可:
// 将所有存在交集的区间合并
void merge(vector<PII> &segs)
vector<PII> res;
sort(segs.begin(), segs.end());
int st = -2e9, ed = -2e9;
for (auto seg : segs)
if (ed < seg.first)
if (st != -2e9) res.push_back(st, ed);
st = seg.first, ed = seg.second;
else ed = max(ed, seg.second);
if (st != -2e9) res.push_back(st, ed);
segs = res;
3.代码
class Solution
public:
vector<vector<int>> merge(vector<vector<int>>& v)
vector<vector<int>> res;
sort(v.begin(),v.end());
int st=-2e9,ed=-2e9;
for(auto x:v)
if(ed<x[0])
if(st!=-2e9) res.push_back(st,ed);
st=x[0],ed=x[1];
else ed=max(x[1],ed);
if(st!=-2e9) res.push_back(st,ed);
return res;
;
706.设计哈希映射
原题链接:706. 设计哈希映射
1.题目描述
2.解题思路
题目要求:不使用任何内建的哈希表库设计一个哈希映射(HashMap)
具体思路:
哈希表的基本思想都是先开一个大数组,然后用某种哈希函数将key映射到数组的下标空间。不同算法的区别在于如何处理下标冲突,即当两个不同的key被映射到同一下标时。我们这里使用拉链法解决冲突。这里的链表我们可以用vector
实现。
- 对于
put(key, value)
操作,我们先求出key的哈希值,然后遍历该位置上的链表,如果链表中包含key,则更新其对应的value;如果链表中不包含key,则直接将(key,value)插入该链表中。 - 对于
get(key)
操作,求出key对应的哈希值后,遍历该位置上的链表,如果key在链表中,则返回其对应的value,否则返回-1。 - 对于
remove(key)
,求出key的哈希值后,遍历该位置上的链表,如果key在链表中,则将其删除。
3.代码
const int N=1e4+3;
class MyHashMap
public:
vector<pair<int,int>> h[N];
MyHashMap()
int find(vector<pair<int,int>> &h,int key)
for(int i=0;i<h.size();i++)
if(h[i].first==key) return i;
return -1;
void put(int key, int value)
int t=key%N;
int k=find(h[t],key);
if(k==-1) h[t].push_back(key,value);
else h[t][k].second=value;
int get(int key)
int t=key%N;
int k=find(h[t],key);
if(k==-1) return -1;
return h[t][k].second;
void remove(int key)
int t=key%N;
int k=find(h[t],key);
if(k!=-1) h[t].erase(h[t].begin()+k);
;
以上是关于LeetCode刷题笔记-数据结构-day2的主要内容,如果未能解决你的问题,请参考以下文章