查找算法重点与个人理解(c++)

二、查找

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;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rebegin_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值