0
点赞
收藏
分享

微信扫一扫

《基础算法模板 | CSDN创作打卡》

一点读书 2022-02-13 阅读 127
算法

1,快速幂算法模板

求 mk%p,时间复杂度 O(logk)。

int qmi(int m, int k, int p)
{
    int res = 1 % p, t = m;
    while (k)
    {
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

 

2,二分查找算法模板

二分模板一共有两个,分别适用于不同情况。
算法思路:假设目标值在闭区间 [l, r] 中, 每次将区间长度缩小一半,当 l = r 时,我们就找到了目标值。

版本1
当我们将区间 [l, r] 划分成 [l, mid] 和 [mid + 1, r] 时,其更新操作是 r = mid 或者 l = mid + 1;,计算mid时不需要加1。

C++ 代码模板: 

int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}

版本2
当我们将区间 [l, r] 划分成 [l, mid - 1] 和 [mid, r] 时,其更新操作是 r = mid - 1 或者 l = mid ;,此时为了防止死循环,计算mid时需要加1。

C++ 代码模板:

int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

 

3,快速排序模板 + 理解

模板代码

void quick_sort(int q[], int L, int R){

    if(L >= R) return;

    int x = q[L], i = L - 1, j = R + 1;
    while(i < j){
        do i ++; while(q[i] < x);
        do j --; while(q[j] > x);
        if(i < j) swap(q[i], q[j]);
    }

    quick_sort(q, L, j);
    quick_sort(q, j + 1, R);
}

 

4, 双指针模板小总结

题目链接:https://www.acwing.com/problem/content/description/802/

模板:

for (int i = 0, j = 0; i < n; i ++ )
{
    while (j < i && check(i, j)) j ++ ;

    // 具体问题的逻辑
}

 代码:

#include<iostream>
using namespace std;
const int N=1000010;
int a[N],b[N];
int n,m,k;

int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++)cin>>b[i];

    for(int i=1,j=m;i<=n;i++){
       while(j>0&&a[i]+b[j]>k)
        {
             j--;
        }
        if(j>0&&a[i]+b[j]==k)
          cout<<i-1<<" "<<j-1<<endl;
    }
    return 0;
}
举报

相关推荐

0 条评论