两数之和
知识点:
- map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率。
- unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的。
- 对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map。参考文献
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hashTable;
int size=nums.size();
for(int i=0;i<size;i++){
auto it=hashTable.find(target-nums[i]);
if(it!=hashTable.end()){
return {it->second,i};
}
hashTable[nums[i]]=i;
}
return {};
}
};
合并两个有序列表
- 关键要声明出两个指针,一个指针的值在不断变化,另一个指针的值记录起始地址。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* preHead=new ListNode(-1);
ListNode* pre = preHead;
while(list1!=nullptr&&list2!=nullptr){
if(list1->val<=list2->val){
pre->next=new ListNode(list1->val);
list1=list1->next;
}else{
pre->next=new ListNode(list2->val);
list2=list2->next;
}
pre=pre->next;
}
pre->next=list1==nullptr?list2:list1;
return preHead->next;
}
};
有效的括号
这一题的关键是用栈来解题。
class Solution {
public:
bool isValid(string s) {
int size=s.size();
if (size%2!=0){
return false;
}
unordered_map<char,int> r={{'{',0},{'}',1},{'[',2},{']',3},{'(',4},{')',5}};
stack<char> st;
for(int i=0;i<size;i++){
if(st.size()!=0&&r[s[i]]%2==1&&r[s[i]]-r[st.top()]==1){
st.pop();
}else{
st.push(s[i]);
}
}
if(st.size()==0){
return true;
}
return false;
}
};