第三课 双指针

 

 双指针算法:

归并、快排等都是。

双指针算法的作用,将O(n^2)的算法优化成O(n)的算法。

 输出一行字符串的每个单词:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    string str;
    getline(cin,str);
    int n = (int)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;
}

最长连续不重复数字的个数:

#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int a[N],s[N];
int main()
{
    int n;
    cin>>n;
    for(int i = 0;i<n;i++) cin>>a[i];
    
    int res = 0;
    for(int i = 0,j = 0;i<n;i++)
    {
        s[a[i]]++;
        while(s[a[i]] > 1)
        {
            s[a[j]]--;
            j++;
        }
        res = max(res,i-j+1);
    }
    cout<<res<<endl;
}

 

 单链表:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N = 100010;
int idx,e[N],ne[N],head;
//initiation
void init()
{
    head = -1;
    idx = 0;
}
//insert to head node
void insert(int x)
{
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx++;
}
//insert to the Kth node back
void add(int k, int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx++;
}
//delete the Kth next node
void del(int k)
{
    ne[k] = ne[ne[k]];
}

int main()
{
    int m;
    cin>>m;
    char a;int b,c;
    init();
    while (m--) {
        cin>>a>>b;
        if(a == 'H'){
            insert(b);
        }else if(a == 'D'){
            if(!b) head = ne[head];
            else del(b-1);
        }else if(a == 'I')
        {
            cin>>c;
            add(b-1,c);
        }
    }
    for(int i = head;i!=-1;i=ne[i])
        cout<<e[i]<<" ";
}

 单调递增的两个数组的找出两个元素恰好等于一个给定的数:

#include <cstdio>
using namespace std;
const int N = 100010;
int a[N],b[N];
int main()
{
    int n,m,x;
    scanf("%d%d%d",&n,&m,&x);
    for(int i = 0;i<n;i++) scanf("%d",&a[i]);
    for(int i = 0;i<m;i++) scanf("%d",&b[i]);
    for(int i = 0;i<n;i++)
    {
        int j = m - 1;
        while(j >= 0 && a[i] + b[j] > x) j--;
        if(a[i] + b[j] == x) 
        {
            printf("%d %d\n",i,j);
            return 0;
        }
    }
}

 lowbit操作:计算每个数二进制中1的个数:

#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int a[N];
int lowbit(int n)
{
    return n & (-n);
}
int main()
{
    int n;
    cin>>n;
    for(int i = 0;i<n;i++)
    {
        cin>>a[i];
        int t = 0;
        while(a[i] & lowbit(a[i]))
        {
            t++;
            a[i] -= lowbit(a[i]);
        }
        cout<<t<<" ";
    }
    
}

 

 
posted @ 2020-03-11 22:19  龙雪可可  阅读(92)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************