日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Acwing799. 最长连续不重复子序列[C++题解]:双指针算法O(n)

發布時間:2025/4/5 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Acwing799. 最长连续不重复子序列[C++题解]:双指针算法O(n) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雙指針算法的核心思想是把for的兩重循環,即復雜度為O(n2)O(n^2)O(n2)優化成O(n)O(n)O(n)

代碼的邏輯如下

for(int i=0,j=0;i<n;i++){while(j<i&&check(i,j)) j++;//每道題具體的邏輯 }

雙指針中:每個指針最多移動n次,兩個指針最多移動2n次,復雜度為O(n2)O(n^2)O(n2)

題目:找到最長的不含有重復字符的序列的長度

沒有優化的二重循環

for(int i=0;i<n;i++){//終點for(int j=0;j<=i;j++){//起點if(check(i,j)) res=max(res,i-j+1);//長度} }

Acwing799. 最長連續不重復子序列
數據量:1e5.

題解
兩個數組a是原數組,s是存儲數據出現個數.
兩個指針:i是區間終點,j是區間起點,則區間內元素個數是i-j+1.判斷重復是在下面的while循環中,對于新來的a[i],如果出現重復,一定是a[i]本身重復,只要s[a[i]]>1就要把j指針一直往右走,并且所到之處的元素的個數要減去。
復雜度O(n)O(n)O(n)

ac代碼

#include<bits/stdc++.h> using namespace std;const int N=100010; int a[N]; int s; //統計個數 unordered_map<int,int> hash1;int main(){int n;cin>>n;for(int i=0;i<n;i++) cin>>a[i];int sum=0;//雙指針移動時統計個數for(int i=0,j=0; i<n;i++){int x=a[i];hash1[x]++; sum++;while(hash1[x]>1){sum--;hash1[a[j]]--;j++;}s=max(s,sum);}cout<<s<<endl;}

總結

以上是生活随笔為你收集整理的Acwing799. 最长连续不重复子序列[C++题解]:双指针算法O(n)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。