leetcode 滑動窗口小結 (二)

目錄

  • 424. 替換后的最長重復字符
    • 思考分析1
    • 優化
  • 1004. 最大連續1的個數 III
    • 友情提醒
    • 方法1,基于當前最大頻數
    • 方法2,基于歷史最大頻數

424. 替換后的最長重復字符

https://leetcode-cn.com/problems/longest-repeating-character-replacement/
給你一個僅由大寫英文字母組成的字符串,你可以將任意位置上的字符替換成另外的字符,總共可最多替換 k 次。在執行上述操作后,找到包含重復字母的最長子串的長度。

注意:
字符串長度 和 k 不會超過 10^4。
示例 1:

輸入:
s = “ABAB”, k = 2
輸出:
4
解釋:
用兩個’A’替換為兩個’B’,反之亦然。

示例 2:

輸入:
s = “AABABBA”, k = 1
輸出:
4
解釋:
將中間的一個’A’替換為’B’,字符串變為 “AABBBBA”。
子串 “BBBB” 有最長重復字母, 答案為 4。

思考分析1

需要注意的地方:

1、何時擴充窗口?
當子串符合要求,向右擴充一位。(貪心思想,滿足了要求還要繼續膨脹)
2、子串達成什么條件能說明符合要求?
如果最大頻數 + k >= 當前窗口長度,(也就是說經過k此修改,我們可以將不是出現次數最多的元素修改為頻數最高元素,從而變為重復串,并且這個串的長度是大于此時窗口長度的)那么我們認為是符合條件的,此時更新窗口長度,取歷史窗口長度與當前窗口長度的較大值
3、什么時候滑動窗口
當子串不滿足條件的時候,窗口整體向右滑動一位,窗口長度不會減少。

class Solution {
public:int characterReplacement(string s, int k) {int left = 0, right = 0;//當前窗口中元素的最高頻數int now_max_freq = 0;int hash_map[26] ={0};//窗口長度最大值int max_window_length = 0;while(right < s.size()){//新加入窗口的元素char c = s[right];//窗口內這個元素對應的頻數+1hash_map[c - 'A']++;//找到整個窗口內最大頻數for(int i = 0; i < 26; i++)now_max_freq = max(now_max_freq,hash_map[i]);//如果最大頻數 + k >= 當前窗口長度,那么我們認為是符合條件的,此時更新窗口長度,取歷史窗口長度與當前窗口長度的較大值if(now_max_freq + k >= right - left + 1){max_window_length = max(max_window_length,right - left + 1);}//如果不滿足整個條件,我們需要將整個窗口平移else{char d = s[left];hash_map[d - 'A']--;left++;}right++;}return max_window_length;}
};

優化

關于優化,首先得知道一點就是我們之前更新窗口長度的條件:
1、先找這個窗口內的最大頻數
2、如果這個頻數 + k >= 當前窗口長度,我們選擇更新窗口長度
由于在尋找最大頻數的時候有個比較過程,并且每次新進來一個字符我們就得重新比較26次。(我們可以優化比較,例如加入備忘錄什么的)。但這里我們不需要這樣做。
我們只需要找到“歷史窗口內元素出現最大頻數”,然后觀察這個頻數 + k 是否 >= 當前窗口長度。
由于這道題目要求求解的是最長重復子串,如果當前窗口最大字符重復個數小于歷史窗口的最大字符重復個數,完全可以將此窗口忽略掉,因為它必然不可能是最長重復子串。只有當歷史窗口的最大字符重復個數更新時,其最大長度才會進行相應的更新。
現在我們將上面的代碼稍作修改,改成如下代碼:

class Solution {
public:int characterReplacement(string s, int k) {int left = 0, right = 0;//歷史最大頻數int history_max_freq = 0;int hash_map[26] ={0};int max_window_length = 0;while(right < s.size()){//新加入窗口的元素char c = s[right];hash_map[c - 'A']++;//觀察整個元素是不是窗口內出現次數最多的元素,如果是更新history值history_max_freq = max(history_max_freq,hash_map[c - 'A']);if(history_max_freq + k >= right - left + 1){max_window_length = max(max_window_length,right - left + 1);}else{char d = s[left];//窗口左移,被移除的元素在窗口內頻數-1hash_map[d - 'A']--;left++;}right++;}return max_window_length;}
};

兩種解法性能相差挺大的。
在這里插入圖片描述
下面一題和本題幾乎一模一樣,甚至是簡化,我們也同樣用兩種思路來做吧。

1004. 最大連續1的個數 III

https://leetcode-cn.com/problems/max-consecutive-ones-iii/
給定一個由若干 0 和 1 組成的數組 A,我們最多可以將 K 個值從 0 變成 1 。

返回僅包含 1 的最長(連續)子數組的長度。
示例 1:

輸入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
輸出:6
解釋:
[1,1,1,0,0,1,1,1,1,1,1]
粗體數字從 0 翻轉到 1,最長的子數組長度為 6。

示例2:

輸入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
輸出:10
解釋:
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗體數字從 0 翻轉到 1,最長的子數組長度為 10。

友情提醒

由于這一題的簡化性,最好好好看看兩者代碼有何區別,不然以為是一樣的。(其實性能應該差不多,因為這里在找當前最大頻數的時候不需要比較26次了,只需要一次。)

方法1,基于當前最大頻數

class Solution {
public:int longestOnes(vector<int>& A, int K) {int left = 0, right = 0;int one_times = 0;int now_max_freq = 0;int max_window_length = 0;while(right < A.size()){int c = A[right];if(c == 1) one_times++;if(one_times + K >= right - left + 1){max_window_length = max(max_window_length,right - left + 1);}else{int d = A[left];if(d == 1) one_times--;left++;}right++;}return max_window_length;}
};

方法2,基于歷史最大頻數

class Solution {
public:int longestOnes(vector<int>& A, int K) {int left = 0, right = 0;int one_times = 0;int history_max_freq = 0;int max_window_length = 0;while(right < A.size()){int c = A[right];if(c == 1) one_times++;history_max_freq = max(history_max_freq,one_times);if(history_max_freq + K >= right - left + 1){max_window_length = max(max_window_length,right - left + 1);}else{int d = A[left];if(d == 1) one_times--;left++;}right++;}return max_window_length;}
};

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

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

相關文章

軟件故障_一些主要的軟件故障

軟件故障The need for software engineering was realized by the software industry after some of its major failures. Some of these failures are listed below, 在經歷了一些重大失敗之后&#xff0c;軟件行業意識到了對軟件工程的需求 。 下面列出了其中一些故障&#x…

十五、修改VGG16網絡來適應自己的需求

一、VGG-16 VGG-16神經網絡是所訓練的數據集為ImageNet ImageNet數據集中驗證集和測試集一萬五千張&#xff0c;有一千個類別 二、加載VGG-16神經網絡模型 VGG16模型使用說明 torchvision.models.vgg16(pretrainedFalse) 其中參數pretrained表示是否下載已經通過ImageNet數…

leetcode 滑動窗口小結 (三)

目錄978. 最長湍流子數組題目思路分析以及代碼1052. 愛生氣的書店老板題目思考分析與初步代碼優化思路以及優化代碼1208. 盡可能使字符串相等題目思考分析以及代碼978. 最長湍流子數組 https://leetcode-cn.com/problems/longest-turbulent-subarray/ 題目 當 A 的子數組 A[…

JAVA多線程學習3--線程一些方法

一、通過sleep方法睡眠 在指定的毫秒數內讓當前正在執行的線程休眠&#xff08;暫停執行&#xff09;。該線程不丟失任何監視器的所屬權。 二、線程優先級 線程具有優先級&#xff0c;范圍為1-10。 MAX_PRIORITY線程可以具有的最高優先級。int類型&#xff0c;值為10. MIN_PRIO…

mcq 隊列_MCQ | 量子密碼學

mcq 隊列1) Which possible Attacks in Quantum Cryptography can take place? 1)量子密碼術中可能發生哪些攻擊&#xff1f; Possible Attacks in Quantum Cryptography and Birthday Attack 量子密碼術和生日攻擊的可能攻擊 Birthday attack and Boomerang attack 生日襲擊…

《inside the c++ object model》讀書筆記 之一:對象

關于對象 ...引子:在C語言中,"數據"和"處理數據的操作(函數)"是分開來聲明的,語言本身并沒有支持"數據和函數"之間關聯性,這種程序成為"程序性的",由一組"分布在各個一功能為向導的函數中"的算法驅動,他們處理的是共同的外部…

十六、保存和加載自己所搭建的網絡模型

一、保存自己搭建的模型方法一 例如&#xff1a;基于VGG16網絡模型架構的基礎上加上了一層線性層&#xff0c;最后的輸出為10類 torch.save(objmodule,f"path")&#xff0c;傳入需要保存的模型名稱以及要保存的路徑位置 保存模型結構和模型的參數&#xff0c;保存文…

uC/OS-II OS_TASK.C中有關任務管理的函數

函數大致用途 OS_TASK.C是uC/OS-II有關任務管理的文件&#xff0c;它定義了一些函數&#xff1a;建立任務、刪除任務、改變任務的優先級、掛起和恢復任務&#xff0c;以及獲取有關任務的信息。 函數用途OSTaskCreate()建立任務OSTaskCreateExt()擴展建立任務OSTaskStkChk()堆…

windows下寫的腳本,在linux下執行失敗

Windows中的換行符為CRLF, 即正則表達式的rn(ASCII碼為13和10), 而Unix(或Linux)換行符為LF, 即正則表達式的n. 在Windows和Linux下協同工作的時候, 往往這個細小的差別就導致問題, 如 1)Windows下寫的Shell腳本, 在Linux下運行時往往出現rn是無效參數, 不能執行; 2)vi 等編器下…

Scala中的do ... while循環

做...在Scala循環 (do...while loop in Scala) do...while loop in Scala is used to run a block of code multiple numbers of time. The number of executions is defined by an exit condition. If this condition is TRUE the code will run otherwise it runs the first …

十七、完整神經網絡模型訓練步驟

以CIFAR-10數據集為例&#xff0c;訓練自己搭建的神經網絡模型架構 一、準備CIFAR-10數據集 CIFAR10官網使用文檔 torchvision.datasets.CIFAR10(root"./CIFAR_10",trainTrue,downloadTrue) 參數描述root字符串&#xff0c;指明要下載到的位置&#xff0c;或已有數…

μC/OS-Ⅱ 操作系統內核知識

目錄μC/OS-Ⅱ任務調度1.任務控制塊2.任務管理3.任務狀態μC/OS-Ⅱ時間管理μC/OS-Ⅱ內存管理內存控制塊MCBμC/OS-Ⅱ任務通信1.事件2.事件控制塊ECB3.信號量4.郵箱5.消息隊列操作系統內核&#xff1a;在多任務系統中&#xff0c;提供任務調度與切換、中斷服務 操作系統內核為每…

第二版tapout

先說說上次流回來的芯片的測試情況。 4月23日&#xff0c; 芯片采用裸片直接切片&#xff0c; bond在板子上&#xff0c;外面加了一個小塑料殼來保護&#xff0c;我們就直接拿回來測試了。 測試的主要分為模擬和數字兩部分&#xff0c; 數字部分的模塊基本都工作正常&#xff0…

cd-rom門鎖定什么意思_CD-ROM的完整形式是什么?

cd-rom門鎖定什么意思CD-ROM&#xff1a;光盤只讀存儲器 (CD-ROM: Compact Disc Read-Only Memory) CD-ROM is an abbreviation of "Compact Disc Read-Only Memory". It is a data storage memory in the form of an optical compact disc, which is read by a syst…

遠程工作時的協作工具

遠程工作時的協作工具 Google Hangout 用于日常會議和面對面交談,在國內其實可以用qq來帶起。Campfire 用于一天來的持續對話。Screenhero 用于分享屏幕&#xff0c;一起寫代碼,這個比較有用,可以一起寫代碼。Balsamiq 用于計劃要制作的 UI。Asana 用于管理任務Google Docs 用于…

十八、完整神經網絡模型驗證步驟

網絡訓練好了&#xff0c;需要提供輸入進行驗證網絡模型訓練的效果 一、加載測試數據 創建python測試文件&#xff0c;beyond_test.py 保存在dataset文件夾下a文件夾里的1.jpg小狗圖片 二、讀取測試圖片&#xff0c;重新設置模型所規定的大小(32,32)&#xff0c;并轉為tens…

二分法變種小結(leetcode 34、leetcode33、leetcode 81、leetcode 153、leetcode 74)

目錄二分法細節1、leetcode 34 在排序數組中查找元素的第一個和最后一個位置2、不完全有序下的二分查找(leetcode33. 搜索旋轉排序數組)3、含重復元素的不完全有序下的二分查找(81. 搜索旋轉排序數組 II)3、不完全有序下的找最小元素(153. 尋找旋轉排序數組中的最小值)4、二維矩…

ID3D11DeviceContext::Dispatch與numthread筆記

假定——[numthreads(TX, TY, TZ)] // 線程組尺寸。既線程組內有多少個線程。Dispatch(GX, GY, GZ); // 線程組的數量。既有多少個線程組。 那么——SV_GroupThreadID{iTX, iTY, iTZ} // 【線程組內的】線程3D編號SV_GroupID{iGX, iGY, iGZ} // 線程組的3D編號SV_DispatchT…

kotlin 查找id_Kotlin程序查找Square區域

kotlin 查找idFormula to find area of Square: area side*side 查找Square面積的公式&#xff1a; area side * side Given the value of side, we have to find the area of Square. 給定side的值&#xff0c;我們必須找到Square的面積。 Example: 例&#xff1a; Input…

小米手環6解決天氣未同步問題

最近我發現了我的米6手環天氣不同步&#xff0c;打開Zepp Life刷新同步也不行&#xff0c;后來我找了一些網上的解決方法&#xff0c;嘗試了一些也還不行&#xff0c;我這人喜歡瞎搗鼓&#xff0c;無意之間給整好了&#xff0c;后來我開始總結自己操作步驟&#xff0c;就在剛才…