哈希表
哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_,完成映射操作,主要是相应的函数。map和set是有序的,使用的是树的形式,unordered_map和unordered_set使用的是散列比表的,无序。
相应函数
set multiset
相应的地址
map multimap
相应地址
unordered_map unordered_multimap
相应位置
unordered_set unordered_multiset
相应地址
刷题
无重复字符的最长子串
暴力的哈希操作,最露比的方法,肯定可以优化的,emm,标志位方法,用一个记录上一个出现的位置,从那里开始新的暴力操作。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.length();
int m = 0;
set<char> mp;
//最露的方法,相当于暴力哈哈
for(int i=0;i<n;i++){
mp.clear();
int index = 0;
for(int j=i;j<n;j++){
if(mp.find(s[j])==mp.end()){
mp.insert(s[j]);
index++;
}else{
break;
}
}
if(index>m) m=index;
}
return m;
}
};
环形链表
class Solution {
public:
bool hasCycle(ListNode *head) {
set<ListNode*> s;
while(head!=NULL){
if(s.find(head)!=s.end()){
return true;
}
s.insert(head);
head = head->next;
}
return false;
}
};
相交链表
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
set<ListNode*> d;
while(headA!=NULL){
d.insert(headA);
headA=headA->next;
}
while(headB){
if(d.find(headB)!=d.end()){
return headB;
}
headB=headB->next;
}
return NULL;
}
};
快乐数
class Solution {
public:
bool isHappy(int n) {
set<int> d;
while(true){
d.insert(n);
if(n==1)break;
int sum = 0;
while(n){
int d = n%10;
n/=10;
sum +=d*d;
}
n=sum;
if(d.find(n)!=d.end()){
return false;
}
}
return true;
}
};