424. 替換後的最長重複字元
給你乙個僅由大寫英文本母組成的字串,你可以將任意位置上的字元替換成另外的字元,總共可最多替換 k 次。在執行上述操作後,找到包含重複字母的最長子串的長度。
如果我們按序遍歷每個字元開始計算符合條件的子串長度,對於每個子串,我們只需要以它的第乙個字元為不變字元。思路簡單,**清晰,耗時巨長,加了乙個遇連續相同字元直接跳過,以及i到達的字元開始的子串不可能為最大時結束,才勉強ac
int characterreplacement(string s, intk) }
if(tmp<=k)
ans=max(ans,min((int)s.length(),(int)s.length()-i+k-tmp));
}return
ans;
}
這題是典型的雙指標問題,或者,滑動視窗問題。不需要儲存每乙個視窗內的字母出現的最大值,因為字母一定是從右邊新添的字元裡出現,而且只有當視窗內出現了比歷史更多的字母數時,答案才會更新,也就是maxcnt不需要是實時的最大字母數。
int characterreplacement(string s, intk) 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,intn)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...