網(wǎng)站首頁 編程語言 正文
前言
雙指針算法
算法思想
雙指針,指的是在遍歷對象的過程中,不是普通的使用單個指針進行訪問,而是使用兩個相同方向(快慢指針)或者相反方向(對撞指針)的指針進行掃描,從而達到相應(yīng)的目的。
換言之,雙指針法充分使用了數(shù)組有序這一特征,從而在某些情況下能夠簡化一些運算。
今天帶大家來學習算法中雙指針的應(yīng)用場景。
一、最長不含重復(fù)字符的子字符串
1.題目要求
2.個人題解
2.1 解題思路
利用雙指針,定義一個指針i和一個指針j
讓i開始走,固定住j,然后我們利用一個輔助數(shù)組來記錄下每個字符出現(xiàn)的次數(shù)。
比如對于字符串“abcabcdd”,當i走到第二個a的時候,a出現(xiàn)了兩次,這時候讓j開始向前走,走到b。
這時候i和j之間的字符串是bca。沒有重復(fù)的,i可以繼續(xù)走,j繼續(xù)固定。
i走到b的時候b出現(xiàn)兩次。這時候要移動j直至沒有字符出現(xiàn)次數(shù)超過兩次。如此反復(fù)直到i走到字符串結(jié)尾。
2.2 代碼實現(xiàn)
class Solution {
public:
/**
* 代碼中的類名、方法名、參數(shù)名已經(jīng)指定,請勿修改,直接返回方法規(guī)定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
int len = s.length();
int S[128];
memset(S,0x00, sizeof(S));
int ans = 0;
for(int i=0,j=0;i<len;++i)
{
S[s.at(i)]++;
while(S[s.at(i)]>1)
{
S[s.at(j)]--;
j++;
}
ans=max(ans,i-j+1); //更新區(qū)間最大長度
}
return ans;
}
};
2.3 代碼解析
首先定義數(shù)組S[128],利用memset函數(shù)來初始化該數(shù)組。
memset:作用是在一段內(nèi)存塊中填充某個給定的值,它是對較大的結(jié)構(gòu)體或數(shù)組進行清零操作的一種最快方法。
for循環(huán)里聲明i,j 為0,先讓字符串的第一個字符對應(yīng)的整數(shù)作為數(shù)組S的下標,該位置元素值加一;
如果沒有重復(fù)字符,ans遞增;如果有重復(fù)字符今后進入while循環(huán),隨著j的遞增,之前數(shù)組里為一的元素值都會減一,為2的元素值也會減一并變?yōu)橐唬?/p>
接著j固定,i繼續(xù)增長,再有重復(fù)字符就會重復(fù)上述操作,最終通過max函數(shù)得到最大的無重復(fù)子字符串長度。
二、和為S的兩個數(shù)字
1.題目要求
2.個人題解
2.1 解題思路
根據(jù)題目可知該數(shù)組是升序排列,那我們可以用兩個指針:一個在左邊界,一個在右邊界。
如果數(shù)組下標對應(yīng)的值相加比num小,那么就讓左邊指針遞增,反之則右邊指針遞減。
如果左右指針相等,說明沒有滿足條件的數(shù)對,返回空數(shù)組。
如果存在該數(shù)對,利用push_back方法插入數(shù)組并返回即可
2.2 代碼實現(xiàn)
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int left,right;
int i,j,k;
vector<int> res;
left=0;
right=array.size()-1;
//如果數(shù)組為空,返回空數(shù)組
if(array.empty()){
return res;
}
while(array[left]+array[right]!=sum && left!=right){
if(array[left]+array[right]<sum){
left+=1;
}else if(array[left]+array[right]>sum){
right-=1;
}
}
//如果不存在該數(shù)對,返回空數(shù)組
if(left==right){
return res;
}
//如果存在
res.push_back(array[left]);
res.push_back(array[right]);
return res;
}
};
本題思路確定后代碼比較好理解,就沒有分析部分了。
這兩道題都是雙指針的解法:第一題相當于是相鄰指針,第二題則是雙端指針,各有特色。
原文鏈接:https://blog.csdn.net/m0_58618795/article/details/126383638
相關(guān)推薦
- 2022-05-06 Pandas?DataFrame數(shù)據(jù)修改值的方法_python
- 2022-08-19 mv命令linux
- 2023-02-23 Android中URLEncoder空格被轉(zhuǎn)碼為"+"號的處理辦法_Android
- 2022-08-19 查看Linux的核數(shù)和內(nèi)存等相關(guān)系統(tǒng)配置
- 2022-04-22 mac解決npm不管裝啥都是zsh: command not found
- 2022-12-25 終于明白tf.reduce_sum()函數(shù)和tf.reduce_mean()函數(shù)用法_python
- 2022-08-10 Golang泛型的使用方法詳解_Golang
- 2023-02-01 MongoDB?事務(wù)支持詳解_MongoDB
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支