[算法每日一練]-雙指針 (保姆級教程篇 1) #A-B數對 #求和 #元音字母 #最短連續子數組 #無重復字符的最長子串 #最小子串覆蓋 #方塊桶

目錄

A-B數對

解法一:雙指針?

解法二:STL二分查找

解法三:map

求和

元音字母

最短連續子數組

無重復字符的最長子串

最小子串覆蓋

方塊桶


????????

雙指針特點:雙指針絕不回頭

????????

????????

A-B數對

????????

解法一:雙指針?

?先把數列排列成遞增的就可以使用雙指針了。找到滿足a[r]-a[l]=c即可

?對每個l找對應的兩個r,一個是滿足條件且在最左邊的,一個是滿足條件且在最右邊的

?如果剛好可以取等,那么右減左就是該情況下的答案,否則右減左就是0

#include <bits/stdc++.h>            
#define ll long long      
using namespace std;       
const int N = 2e5 + 10;
int n , c;
int a[N];
int main () 
{cin >> n >> c;for(int i = 1 ; i <= n ; i ++) cin >> a[i];sort(a + 1 , a + 1 + n);      //首先就必須要排序int l = 1, r1 = 1 , r2 = 1;ll ans = 0;for(l = 1 ; l <= n ; l ++) {while(r1 <= n && a[r1] - a[l] <= c) r1 ++;//對每一個數A找右邊剛不滿足A-B=C的數下標while(r2 <= n && a[r2] - a[l] < c ) r2 ++;//再找左邊剛滿足A-B=C的數下標ans += r1 - r2;}cout << ans;return 0;
}

解法二:STL二分查找

在有序數組找某個數不用stl用什么?

#include <bits/stdc++.h>
using namespace std;
int N, C, A[200010];int main() {scanf( "%d%d", &N, &C );for( int i = 1; i <= N; ++i ) scanf( "%d", &A[ i ] );sort( A + 1, A + N + 1 );long long ans = 0;for( int i = 1; i <= N; ++i ) ans += upper_bound( A + 1, A + N + 1, A[ i ] - C ) - lower_bound( A + 1, A + N + 1, A[ i ] - C );printf( "%lld\n", ans );return 0;
}

解法三:map

既然要同一個值得數量,那么就拿數值存下標,說錯了。這樣會爆掉的,直接上map進行離散化數組就行了,什么意思?就是你別拿一個連續的玩意去存,你拿一個離散的東西去存就行了。

#include <iostream>             //A-B數對P1102   (map映射法)   (有點耗時)
#include <unordered_map>                  //A-B=C --> A-C=B
using namespace std;
typedef long long LL;
LL a[200001];
unordered_map<LL,LL> m;       //建立一個數字到出現次數的映射 map<num,times>
int main() {int n; LL c;LL ans=0;cin >> n >> c;    for(int i=1;i<=n;i++) {cin >> a[i];    m[a[i]]++;     //標記每個數字和對應的映射a[i]-=c;       //把first減c,找更新后映射的數量} for(int i=1;i<=n;i++) ans+=m[a[i]];cout << ans << endl;return 0;
}

????????

?????????

求和

求滿足和為x所有的自然數區間,如果沒有輸出No

????????

思路:

對每個l開頭的區間嘗試求解。

雙指針移動時:[l,r]恰好為x就說明[l,r+1]和[l+1,r]沒用了,所以整體右移l++,r++

[l,r]<x就r右移,[l,r]>x就l右移(這次的l已經沒用了)

然后就是注意一下結束條件l<=x/2

#include <bits/stdc++.h>
using namespace std;
int main(){int x,l=1,r=2,sum=0;cin>>x;int f=0;while(l<=x/2){ //這個結束條件很有意思:l<=x/2就沒必要再找了sum=(l+r)*(r-l+1)/2;if(sum==x){f=1;cout<<l<<" "<<r<<'\n';l++;r++;}else if(sum<x)r++;else l++;}if(!f)cout<<"No";
}

????????

????????

元音字母

給一個字符串s和整數k,求s的長度為k的子串可能包含的最大元音字母個數

輸入? ? ? ? ? ? ? ? ? ? ? ? ? ? ?輸出:3
abciiidef

????????

思路:

[l,r]一定是整體移動的,所以只需要觀察l和r+1情況即可,如果都是或都不是,cnt不變直接不管;剩下的就是cnt++和cnt--了

#include <bits/stdc++.h>
using namespace std;
int check(char ch){if(ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')return true;return false;
}
int main(){string s;int k;cin>>s>>k;int l=0,r=k-1,ans=0,cnt=0,len=s.size();for(int i=0;i<k;i++){if(check(s[i]))cnt++;//初始化}ans=cnt;while(r<len){//整體移動一次就判斷一次if(!check(s[l])&&check(s[r+1]))cnt++;if(check(s[l])&&!check(s[r+1]))cnt--;l++;r++;ans=max(ans,cnt);}cout<<ans;
}

????????

????????

最短連續子數組

給一個含有n個非負數的數組和一個正整數m。找出該數組中滿足和不小于m的長度最小的連續子數組,并返回其長度,否則返回0

輸入? ? ? ? ? ? ? ? ?輸出:2
6 7
2 3 1 2 4 3

????????

思路:

?在移動過程中[l,r]如果滿足條件的話,一定要l++來取最小長度,否則就r++即可。

(一直都是r在默默前行,l只需要統計結果即可)

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,a[N],ans=0x3f3f3f3f;int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}int sum=0;for(int l=0,r=0;r<=n;r++){sum+=a[r];while(sum>=m){ans=min(ans,r-l+1);sum-=a[l];l++;}}cout<<(ans==0x3f3f3f3f ? 0 : ans);
}

????????

????????

無重復字符的最長子串

給一個字符串s,找出其中不含有重復字符的最長字串的長度。
abcabcbb

????????

思路:

?首先使用map<char,int>來統計每個字符出現次數,一遍統計一遍檢查是否有重復字符。

如果有,對于[l,r]就l++,直到沒有再r++


#include <bits/stdc++.h>
using namespace std;
unordered_map<char,int>ma1;
string s;
int ans=0;
int main(){getline(cin,s);int len1=s.size();for(int l=0,r=0;r<len1;r++){ma1[s[r]]++;while(ma1[s[r]]==2){ma1[s[l]]--;l++;}ans=max(ans,r-l+1);}cout<<ans;
}

????????

????????

最小子串覆蓋

給兩個字符串s,t,求s中最短的包含t每一個字符的子串,若不存在就返回No
輸入

ADOBECODEANXBC? ? ? ? ? ? ? ? 輸出ANXBC
BANC

????????

思路:

不是找子序列啊,注意看樣例。

首先要統計t字符串的字符情況,然后在對s字符串使用雙指針時候,也要統計區間中的字符情況,同時記錄和t字符串的字符滿足個數:對應字符數量相等。

當[l,r]中已經滿足條件時候,就l++取找答案,同時對應的字符數量減一,直到不滿足再r++。

????????

#include <bits/stdc++.h>
using namespace std;
unordered_map<char,int>ma1,ma2;
string s,t;
int ans=0x3f3f3f3f;
int main(){cin>>s>>t;int len1=s.size(),len2=t.size();for(int i=0;i<len2;i++)ma2[t[i]]++;int sum=0;//sum表示滿足的個數int l=0,r=0,ll=0,rr=0;while(r<len1){ma1[s[r]]++;if(ma2[s[r]]!=0&&ma1[s[r]]<=ma2[s[r]])//是t的字符,且s的數量不多余sum++;if(sum==len2){while(ma1[s[l]]>ma2[s[l]]){//從左開始刪掉多余的,l++一次刪掉一次ma1[s[l]]--;l++;}if(r-l+1<ans){ans=r-l+1;ll=l;rr=r;//ll和rr是上次答案對應的左右指針}}r++;}	if(ans==0x3f3f3f3f) cout<<"No";elsecout<<s.substr(ll,rr-ll+1);
}

????????

????????

方塊桶

給n個非負整數表示連續n個豎直放置的方塊,計算這樣的方塊可以裝多少水?
12
0 1 0 2 1 0 1 3 2 1 2 1

????????

思路:

其實在模擬的時候發現左邊這個高度下是否可以填水取決于右邊的最大高度,右邊更高,那么一定可以填水,右邊同理。然后兩條同時開始統計就行了

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,a[N],maxl,maxr,ans;
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];maxl=a[1],maxr=a[n];int l=1,r=n;while(l<r){if(maxl<=maxr){l++;maxl=max(maxl,a[l]);ans+=maxl-a[l];}else{r--;maxr=max(maxr,a[r]);ans+=maxr-a[r];}}cout<<ans;
}

????????

????????

?????????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213698.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《C++新經典設計模式》之第8章 外觀模式

《C新經典設計模式》之第8章 外觀模式 外觀模式.cpp 外觀模式.cpp #include <iostream> #include <memory> using namespace std;// 中間層角色&#xff0c;隔離接口&#xff0c;兩部分模塊通過中間層打交道 // 提供簡單接口&#xff0c;不與底層直接打交道 // 提…

Grounding DINO、TAG2TEXT、RAM、RAM++論文解讀

提示&#xff1a;Grounding DINO、TAG2TEXT、RAM、RAM論文解讀 文章目錄 前言一、Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection1、摘要2、背景3、部分文獻翻譯4、貢獻5、模型結構解讀a.模型整體結構b.特征增強結構c.解碼結構 6、實…

使用Sourcetrail解析C項目

閱讀源碼的工具很多&#xff0c;今天給大家推薦一款別具一格的源碼閱讀神器。 它就是 Sourcetrail&#xff0c;一個免費開源、跨平臺的可視化源碼探索項目 使用

釋放深度學習的力量:使用 CUDA 和 Turing GPU 構建 AI

深度學習是一種人工智能的分支,它使用神經網絡模擬人類大腦的學習過程,從大量的數據中學習特征和規律。深度學習已經徹底改變了無數領域,從圖像和語音識別到自然語言處理和自動駕駛汽車。但是,要充分利用深度學習的強大功能,需要強大的工具,而 NVIDIA 的 Turing GPU 就是…

Faster R-CNN pytorch源碼血細胞檢測實戰(二)數據增強

Faster R-CNN pytorch源碼血細胞檢測實戰&#xff08;二&#xff09;數據增強 文章目錄 Faster R-CNN pytorch源碼血細胞檢測實戰&#xff08;二&#xff09;數據增強1. 資源&參考2. 數據增強2.1 代碼運行2.2 文件存放 3 數據集劃分4. 訓練&測試5. 總結 1. 資源&參…

靜態SOCKS5的未來發展趨勢和新興應用場景

隨著網絡技術的不斷發展和進步&#xff0c;靜態SOCKS5代理也在不斷地完善和發展。未來&#xff0c;靜態SOCKS5代理將會呈現以下發展趨勢和新興應用場景。 一、發展趨勢 安全性更高&#xff1a;隨著網絡安全問題的日益突出&#xff0c;用戶對代理服務器的安全性要求也越來越高…

AcWing 3425:小白鼠排隊 ← 北京大學考研機試題

【題目來源】https://www.acwing.com/problem/content/3428/【題目描述】 N 只小白鼠&#xff0c;每只鼠頭上戴著一頂有顏色的帽子。 現在稱出每只白鼠的重量&#xff0c;要求按照白鼠重量從大到小的順序輸出它們頭上帽子的顏色。 帽子的顏色用 red&#xff0c;blue 等字符串來…

c#下載微信跟支付寶交易賬單

下載微信交易賬單 //賬單日期只能下載前一天的string datetime DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");string body "";string URL "/v3/bill/fundflowbill" "?bill_date" datetime;//生成簽名認證var auth BuildAu…

nodejs 異步函數加 await 和不加 await 的區別

在 nodejs 中&#xff0c;異步函數加上 await 和不加 await 的區別在于函數的返回值。 當一個異步函數加上 await 時&#xff0c;它會暫停當前函數的執行&#xff0c;直到異步操作完成并返回結果。這意味著可以直接使用異步操作的結果&#xff0c;而不需要使用 .then() 方法或…

什么是私有云和私有云計算?

私有云也被稱為本地云架構&#xff0c;部署在企業的內部數據中心。如今&#xff0c;越來越多的提供商提供自己的私有云服務&#xff0c;以增強甚至取代企業自己的私有云環境。 美國國家標準與技術研究所 (NIST) 對私有云的定義是&#xff1a;“云基礎架構為單一組織置備并為其…

【華為鴻蒙系統學習】- HarmonyOS4.0開發|自學篇

? &#x1f308;個人主頁: Aileen_0v0 &#x1f525;熱門專欄: 華為鴻蒙系統學習|計算機網絡|數據結構與算法 &#x1f4ab;個人格言:"沒有羅馬,那就自己創造羅馬~" 目錄 HarmonyOS 4.0 技術介紹&#xff1a; HarmonyOS三大特征&#xff1a; 1.實現硬件互助&#…

Appium 并行測試多個設備

一、前置說明 在自動化測試中&#xff0c;經常需要驗證多臺設備的兼容性&#xff0c;Appium可以用同一套測試運例并行測試多個設備&#xff0c;以達到驗證兼容性的目的。 解決思路&#xff1a; 查找已連接的所有設備&#xff1b;為每臺設備啟動相應的Appium Server&#xff1b…

docker的資源控制:

docker的資源控制&#xff1a; 對容器的使用宿主機的資源進行限制 cpu 內存 磁盤i/0 docker使用linux自帶的功能cgroup control grouos是linux內核系統提供的一種可以限制&#xff0c;記錄&#xff0c;隔離進程所使用的物理資源 control grouos是linux內核系統提供的一種可…

CSP-202309-2 坐標變換(其二)(模擬,c++,vector建二叉樹)

計算機軟件能力認證考試系統 問題描述 試題編號&#xff1a;202309-3試題名稱&#xff1a;梯度求解時間限制&#xff1a;1.0s內存限制&#xff1a;512.0MB問題描述&#xff1a; 背景 西西艾弗島運營公司近期在大力推廣智能化市政管理系統。這套系統是由西西艾弗島信息中心研發…

DAPP開發【11】IPFS星際文件管理系統【簡介,實踐看12】

IPFS&#xff08;InterPlanetary File System&#xff09;是一個點對點的分布式文件系統&#xff0c;旨在創建一個更快速、更安全和更開放的 Web。它不同于傳統的 HTTP 協議&#xff0c;因為它不需要使用一個固定的地址來訪問文件&#xff0c;而是通過一個基于內容尋址的系統&a…

HeartBeat監控Mysql狀態

目錄 一、概述 二、 安裝部署 三、配置 四、啟動服務 五、查看數據 一、概述 使用heartbeat可以實現在kibana界面對 Mysql 服務存活狀態進行觀察&#xff0c;如有必要&#xff0c;也可在服務宕機后立即向相關人員發送郵件通知 二、 安裝部署 參照章節&#xff1a;監控組件…

S32K324 UDS Bootloader開發-下位機篇-App軟件開發

文章目錄 前言ld文件修改增加編譯文件CAN發送與接收發送接收函數調用UDS協議增加校驗算法Hex文件合并總結前言 本文參考NXP官網的S32K3 Bootloader,移植實現UDS刷寫功能。本文是APP軟件的修改 本文參考NXP官網的S32K324 UBL,其中有一些Bug,也有一些和上位機不兼容的地方,在本…

每日一博 - 圖解5種Cache策略

文章目錄 概述讀策略Cache AsideRead Through 寫策略Write ThroughWrite AroundWrite Back 使用場景舉例 概述 緩存是在系統中存儲數據的臨時存儲器&#xff0c;用于提高訪問速度。緩存策略定義了如何在緩存和主存之間管理數據 讀策略 Read data from the system: &#x1f5…

vue3原生方法滾動列表

效果圖 代碼 import { ref, onBeforeUnmount, onUnmounted } from "vue"; //定時器初始化 let timer ref(null); //ref綁定初始化 let roll ref(null); //等同于vue2中的beforeDestroy onBeforeUnmount(() > {//清除定時器clearTimeout(timer.value); }); //等同…

AGI時代探導開發的智能化落地之路:中國企業低代碼及無代碼應用價值報告V6

今天分享的AGI系列深度研究報告&#xff1a;《AGI時代探導開發的智能化落地之路&#xff1a;中國企業低代碼及無代碼應用價值報告V6》。 &#xff08;報告出品方&#xff1a;甲子光年智庫&#xff09; 報告共計&#xff1a;47頁 點擊添加圖片描述&#xff08;最多60個字&…