雙指標專題

2022-06-12 11:57:08 字數 1607 閱讀 1835

424. 替換後的最長重複字元

給你乙個僅由大寫英文本母組成的字串,你可以將任意位置上的字元替換成另外的字元,總共可最多替換 k 次。在執行上述操作後,找到包含重複字母的最長子串的長度。

如果我們按序遍歷每個字元開始計算符合條件的子串長度,對於每個子串,我們只需要以它的第乙個字元為不變字元。思路簡單,**清晰,耗時巨長,加了乙個遇連續相同字元直接跳過,以及i到達的字元開始的子串不可能為最大時結束,才勉強ac

int characterreplacement(string s, int

k) }

if(tmp<=k)

ans=max(ans,min((int)s.length(),(int)s.length()-i+k-tmp));

}return

ans;

}

這題是典型的雙指標問題,或者,滑動視窗問題。不需要儲存每乙個視窗內的字母出現的最大值,因為字母一定是從右邊新添的字元裡出現,而且只有當視窗內出現了比歷史更多的字母數時,答案才會更新,也就是maxcnt不需要是實時的最大字母數。

int characterreplacement(string s, int

k) ans=max(ans,i-left+1

); }

return

ans;

}

457. 環形陣列迴圈

給定乙個含有正整數和負整數的環形陣列 nums。 如果某個索引中的數 k 為正數,則向前移動 k 個索引。相反,如果是負數 (-k),則向後移動 k 個索引。因為陣列是環形的,所以可以假設最後乙個元素的下乙個元素是第乙個元素,而第乙個元素的前乙個元素是最後乙個元素。

確定 nums 中是否存在迴圈(或週期)。迴圈必須在相同的索引處開始和結束並且迴圈長度 > 1。此外,乙個迴圈中的所有運動都必須沿著同一方向進行。換句話說,乙個迴圈中不能同時包括向前的運動和向後的運動。

原方法:

用乙個陣列vis記錄

vis[i]=k表示 結點 i 是從下標 k 為起始點出發所能到達的路徑上的點

每次從未探索過的i出發找大於1的環

bool circulararrayloop(vector&nums)                    

//計算環的長度

break; //

從i出發僅有1單位長度的環,繼續從i+1開始找

}

if(vis[t]!=-1)break; //

跑到之前走過的路上去了,之前無解,這次也無解

vis[t]=i;

t=(t+n+nums[t])%n;

while(t<0)t=(t+n);}}

return

false

; }

改進方法:既然是雙指標的問題,又有環,那快慢指標肯定沒跑了

int idx(int i, int dx,int

n)bool circulararrayloop(vector&nums) }}

return

false

; }

待更新。。。

leetcode 雙指標專題

題目 4.尋找兩個有序陣列的中位數 解析 通過2個下標來依次比較2個陣列的元素,直到走過的數量達到一半,複雜度 m n 2 答案 double findmediansortedarrays int nums1,int nums1size,int nums2,int nums2size else co...

劍指offer 雙指標專題

很經典的雙指標題目 讓指標pt 1 先走k步,pt 2出發。這樣當pt 1達到末尾時,pt 2剛好走到倒數第k個。definition for singly linked list.class listnode def init self,x self.val x self.next none cl...

專題 鍊錶雙指標問題(快慢指標 相遇指標)

雙指標 分別指向兩個鍊錶,每個鍊錶各自乙個指標 快慢指標 指向同乙個鍊錶,一前一後,前進速度不同 相遇指標 指向同乙個有環鏈表,一前一後,前進速度不同 面試題22.鍊錶中倒數第k個節點 definition for singly linked list.public class listnode c...