二、查找
2.1二分查找
库函数:
lower_bound (vec.begin(),vec.end(),xx):从数组中找到第一个不小于 xx 的元素,返回值是迭代器it,减去vec.begin(),变成下标。特殊:如果找不到大于等于xx的元素(xx最大),那么返回vec.end(),即减去vec.begin()后得到的值是数组的长度。
upper_bound:从数组中找到第一个大于 xx 的元素,返回值同上
模板:
int left=0;
int right=n;
while(left<right)
{
int mid=left+(right-left)/2;
if(test(mid)>target) right=mid-1;
if( ....==) return mid;
if(xxx<xxx) left=mid+1;
}
if(test(left)==target) return left;
return -1;
2.2 哈希表map与set
(1)map(快速查找,二维)
unordered_map <int,int> map
map.find(xx) (!=map.end())
map.insert(make_pair("hello",5));
map.insert(pair<int,int>(1,"first"));
(2)set(快速查找、自动去重、set自动排序)
unoreder_set<int> s
set <int> s
(自动排序,递增序列)
元素的访问只能通过迭代器
2.3 bfs,dfs
2.3.1 dfs
基本形式:递归
数据结构:栈
①二叉树
前序遍历:根在最前,根左右
中:左根右
后:左右根
(左、右是递归操作,根是直接操作(不一定是输出,操作可以多样化,比如val的比较、push_back等))
***二叉搜索树的中序遍历,直接操作设置为push_back,得到的vec就会是递增数组***
②高级dfs
回溯、分治
回溯trackback()
void trackback(){
if(xx) ans.push_back(vec)
vec.push_back(xx);
trackback(vec,..);
vec.pop_back();
}
③全排列:
<1>使用next_permutation
example:
int a[4]={1,2,3,4};
sort(a,a+4);
do{
//cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
for(int i=0;i<4;i++)
cout<<a[i]<<" ";
cout<<endl;
}while(next_permutation(a,a+4));
<2>使用回溯
vector<vector<int>> ans;
int n;
void trackback(int cur,vector<int> vec) {
if(cur==n-1){
ans.emplace_back(vec); return;
}
for(int i=cur;i<n;i++){
swap(vec[i],vec[cur]);
trackback(cur+1,vec);
swap(vec[i],vec[cur]);//back
}
}
vector<vector<int>> permute(vector<int>& nums) {
n=nums.size();
trackback(0,nums);
return ans;
}
2.3.2 bfs
zero.model
while(!que.empty())
{
xx cur=que.front();
que.pop();
if(xx) que.push(g(cur));
...
}
①二叉树层序遍历
queue <TreeNode*> que;
vector<double> averageOfLevels(TreeNode* root) {
vector<double>ans;
que.push(root);
while(!que.empty())
{
double sum=0;
int size=que.size();
for(int i=0;i<size;i++)
{
TreeNode* node=que.front();
que.pop();
sum+=node->val;//operation
if(node->left!=NULL) que.push(node->left);
if(node->right!=NULL) que.push(node->right);
}
ans.push_back(sum/size);
}
return ans;
}