持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
前言
把看过的模型总结一下吧,方便以后看。
思路
因为是三个数,且把012排序,那么可以利用快排3.0的merge部分,解决荷兰国旗问题。
荷兰国旗 只有三种颜色 0 1 2 为每一种颜色分配一个区域 把最中间的颜色1视为target 则分成的三个区域为: 分别是 num<target => less区域 num== target =>target区域 num>target =>more区域 遍历数组中的元素(颜色) 当此时的值小于target 则当前值与less区域的边界交换 然后扩展less区域,将目标值纳入less区域中 若当前值大于target 则当前值与more区域的边界交换 然后扩展more区域,将目标值纳入more区域 等于target 不做任何调换操作 continue; 此处撰写解题思路
代码
--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
class Solution {
public:
void sortColors(vector<int>& nums) {
int left=0;
int right=nums.size()-1;
int less=left-1;//小于区域右边界
int more=right+1;//大于区域左边界
int p=1;
while(left< more){
if(nums[left]<p){
swap(nums[++less],nums[left++]);
} else if(nums[left]>p){
swap(nums[--more],nums[left]);
}else{
left++;
}
}
}
};
0.为什么是栈
因为要后进先出的元素与当前元素做比较。
1.map和unordered_map的不同
1.1 使用方法不同
使用方法是最直观的区别,这两种结构虽然都在STL库中,但是所使用的头文件不同。 map:#include<map> unordered_map:#include <unordered_map>
1.2数据结构不同
map是基于红黑树结构实现的。 unordered_map是基于哈希表(也叫散列表)实现的。
1.3元素排列顺序不同
map:基于红黑树,元素有序存储 unordered_map:基于散列表,元素无序存储
1.4插入和查询的时间复杂度不同
map:基于红黑树,复杂度与树高相同,即O(logn)。 unordered_map:基于散列表,复杂度依赖于散列函数产生的冲突多少,但大多数情况下其复杂度接近于O(1)。
1.5效率及其稳定性不同
这点实际上也是由底层的数据结构决定的。
存储空间:unordered_map的散列空间会存在部分未被使用的位置,所以其内存效率不是100%的。而map的红黑树的内存效率接近于100%。 查找性能的稳定性:map的查找类似于平衡二叉树的查找,其性能十分稳定。例如在1M数据中查找一个元素,需要多少次比较呢?20次。map的查找次数几乎与存储数据的分布与大小无关。而unordered_map依赖于散列表,如果哈希函数映射的关键码出现的冲突过多,则最坏时间复杂度可以达到是O(n)。因此unordered_map的查找次数是与存储数据的分布与大小有密切关系的,它的效率是不稳定的。
结语
map和unordered_map并无好坏之分,它们都有各自应用的场景。它们之间的区别归根结底来源于使用的数据结构不同。
最后一句话,总结一下它们的适用场景: 在需要元素有序性或者对单次查询性能要求较为敏感时,请使用map,其余情况下应使用unordered_map。 因此在需要使用字典结构进行算法编程的大部分情况下,都需要使用unordered_map而不是map。
2.代码说明
--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
bool isValid(string s) {
map<char,int> m={{'(',1},{')',-1},{'[',2},{']',-2},{'{',3},{'}',-3}};
stack<char> sta;
for(char c:s){
if(!sta.empty()){
if(m[c]>0){ //大于0说明是左括号直接进栈
sta.push(c);
}
else if(-m[c]==m[sta.top()]) { //判断栈顶是不是和当前右括号匹配
sta.pop();
}else{ //不匹配返回false
return false;
}
} else{
if(m[c]<0){ //空的栈,还进来个右括号,直接false
return false;
}
sta.push(c);
}
}
return sta.empty();
}