第三课 双指针

 

 双指针算法:

归并、快排等都是。

双指针算法的作用,将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 @   龙雪可可  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
****************************************** 页脚Html代码 ******************************************
点击右上角即可分享
微信分享提示