Acwing799. 最长连续不重复子序列[C++题解]:双指针算法O(n)
生活随笔
收集整理的這篇文章主要介紹了
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高精度除以低精度板子
- 下一篇: 银行卡开通网银有什么用