基本算法总结

一.快速排序
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);
    }
    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
二.归并排序
void merge_sort(int q[],int l,int r)
    {
        if(l>=r) return ;
        int mid=l+r>>1;
        merge_sort(q,l,mid);merge_sort(q,mid+1,r);
        int k=0,i=l,j=mid+1;
        while(i<=mid&&j<=r)
            if(q[i]<=q[j]) tmp[k++]=q[i];
            else tmp[k++]=q[j];
        while(i<=mid) tmp[k++]=q[i++];
        while(j<=r) tmp[k++]=q[j++];
        for(int i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];

    }
三.整数二分
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;
    }
四.高精度a+b
#include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+10;
    vector<int> add(vector<int> &a,vector<int > &b)
    {
        vector<int>c;
        int t=0;
        for(int i=0;i<a.size()||i<b.size();i++)
        {
            if(i<a.size()) t+=a[i];
            if(i<b.size()) t+=b[i];
            c.push_back(t%10);
            t/=10;
        }
        if(t) c.push_back(1);
        return c;
    }
    int main()
    {
        string a,b;
        vector<int>A,B;
        cin>>a>>b;
        for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
        for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
        auto c=add(A,B);
        for(int i=c.size()-1;i>=0;i--) printf("%d",c[i]);
        return 0;
    }
五.高精度a-b
bool compare(vector<int> &a,vector <int >&b)
    {
        if(a.size()!=b.size()) return a.size()>b.size();
        for(int i=a.size()-1;i>=0;i--)
        {
            if(a[i]!=b[i]) return a[i]>b[i];

        }
        return true;
    }
    vector<int> add(vector<int> &a,vector<int > &b)
    {
        int t=0;
        vector<int> c;
        for(int i=0;i<a.size();i++)
        {
            t=a[i]-t;
            if(i<=b.size()) t-=b[i];
            c.push_back((t+10)%10);
            if(t<0) t=1;
            else t=0;
        }
        while(c.size()>1&&c.back()==0) c.pop_back();
        return c;
    }
六.高精度a*b
  vector<int> add(vector<int> &a,int b)
    {
        int t=0;
        vector<int> c;
        for(int i=0;i<a.size()||t!=0;i++)
        {
            if(i<a.size()) t+=a[i]*b;
            c.push_back(t%10);
            t=t/10;
        }
        while(c.size()>1&&c.back()==0) c.pop_back();
        return c;
    }
七.高精度a/b
 vector<int> add(vector<int> &a,int b,int &r)
    {
        int t=0;
        vector<int> c;
        for(int i=0;i<a.size()||t!=0;i++)
        {
            c.push_back(r/b);
            r%=b;
        }
        reverse(c.begin(),c.end());
        while(c.size()>1&&c.back()==0) c.pop_back();
        return c;
    }
八.前缀和
 scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);

    for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i]; // 前缀和的初始化
九. 子矩阵的和
  for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
十.双指针算法
eg.1  #include<bits/stdc++.h>
    using namespace std;
    int main ()
    {
        string str;
        getline(cin,str);
        int n=str.size();
        for(int i=0;i<n;i++)
        {
            int j=i;
            while (j<n&&str[j]!=' ') j++;
            for(int k=i;k<j;k++) cout<<str[k];
            cout<<endl;
            i=j;
        }
        return 0;

    }
  eg.2
    for (int i = 0, j = 0; i < n; i ++ )
    {
        s[q[i]] ++ ;
        while (j < i && s[q[i]] > 1)
        {
            s[q[j]]--;
            j++;
        }
        res = max(res, i - j + 1);
    }
十一.位运算
while (n -- )
    {
        int x, s = 0;
        scanf("%d", &x);

        for (int i = x; i; i -= i & -i) s ++ ;

        printf("%d ", s);
    }
    while(n--)
    {
        int x;
        cin>>x;
        int res=0;
        while(x) x-=low(x),res++;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值