C++ 滑動窗口

例1

209. 長度最小的子數組

①窗口大小不固定

②求最小長度 -> ret = INT_MAX

③數組內的值都大于0, 符合單調性(sum? +=? nums[right] -> sum增大)

while里面符合條件,在里面更改ret

參考代碼

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int ret = INT_MAX;for(int left = 0, right = 0, sum = 0; right < nums.size(); right++){sum += nums[right];while(sum >= target){ret = min(ret, right - left + 1);sum -= nums[left++];}}return ret == INT_MAX ? 0 : ret;}
};

例2

3. 無重復字符的最長子串

while里面是不符合條件的,外面與ret比較就行

參考代碼

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128] = {0};int ret = 0;for(int left = 0, right = 0; right < s.size(); right++){hash[s[right]]++;while(hash[s[right]] > 1){hash[s[left++]]--;}ret = max(ret, right - left + 1);}return ret;}
};

例3

1004. 最大連續1的個數 III

[right,? left],有效閉區間

參考代碼

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int ret = 0;for(int left = 0, right = 0, zero = 0; right < nums.size(); right++){if(nums[right] == 0) zero++;while(zero > k){if(nums[left++] == 0) zero--;}ret = max(ret, right - left + 1);}return ret;}
};

例4

轉換為求中間最大長度

如果要用注釋掉的部分,就要寫上target == 0,因為while(tmp >= target) 會left++,這里的==會導致left越界,所以分開寫較好,把滿足條件的放在外面

參考代碼

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum = 0, ret = -1;for(auto e : nums)sum += e;int target = sum - x;if(target < 0) return -1;// if(target == 0) return nums.size();//for(int left = 0, right = 0, tmp = 0; right < nums.size(); right++){tmp += nums[right];// while(tmp >= target)//☆☆☆☆☆// {//     if(tmp == target)//         ret = max(ret, right - left + 1);//     tmp -= nums[left++];//==的時候越界最后一次// }while(tmp > target) tmp -= nums[left++];if(tmp == target) ret = max(ret, right - left + 1);}return ret == -1 ? -1 : nums.size() - ret;}
};

例5

904. 水果成籃

后面的題都用到哈希映射

分析:哈希的臨界點是從0 -> 1 和從 1 -> 0

語法:--hash[fruits[left++]] ,看括號,里面的優先,外面括號的前置“++”,“--” 往后稍稍,所以hash的索引是fruit[left],再是left自增,再是--hash[fruit[left]]

參考代碼

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001] = {0}, ret = 0;for(int left = 0 ,right = 0 ,count = 0; right < fruits.size(); right++){if(hash[fruits[right]]++ == 0) count++;while(count > 2)if(--hash[fruits[left++]] == 0) count--;ret = max(ret, right - left + 1);}return ret;}
};

例6

438. 找到字符串中所有字母異位詞

分析:因為是固定窗口,所以:if(right - left + 1 > p.size())用的是if,只用右移一次left

語法分析:

①代碼是全都拆開

②后置++?和后置 -- ,在這里,兩個寫一起是不對的,因為右操作數例有left,:順序是這樣的:顯示返回hash2[s[left],然后left++,然后hash2[s[left]]--,這時候left已經變大了1,導致左右兩邊left不是相同的值

③和⑤可以統一left

②③和④⑤是后置-- 和前置-- 的區別,所以判斷條件也會不同。個人覺得后置的更好直接理解

參考代碼

class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> ret;int hash1[128] = {0}, hash2[128] = {0};for(auto e : p)hash1[e]++;for(int left = 0, right = 0, count = 0; right < s.size(); right++){if(++hash2[s[right]] <= hash1[s[right]]) count++;if(right - left + 1 > p.size()){// if(hash2[s[left]] <= hash1[s[left]]) count--;    1// hash2[s[left]]--;// left++;//if(hash2[s[left++]]-- <= hash1[s[left]]) count--;不對先++ 2// if(hash2[s[left]]-- <= hash1[s[left]]) count--;    3// left++;//if(--hash2[s[left++]] < hash1[s[left]]) count--;//不行   4//這里的后綴++比前置的--優先級高if(--hash2[s[left]] < hash1[s[left]]) count--;    //5left++;}if(count == p.size())ret.push_back(left);}return ret;}
};

例7

分析:對比上題就是把字符換成了字符串,那就只能用unordered_map<string, int>,

題目說了words里面的每個元素的長度相同,次數:words[0].size()

注意 left,right = i,不是=0,不然會ret是重復的數組

對于這行代碼: if(hash1.count(in) && ++hash2[in] <= hash1[in]) count++;如果hash1[in]沒有這個in,那么會自己創建一個,會浪費時間,前面加上hash1.count(in)判斷,可以減少時間的消耗

參考代碼

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {unordered_map<string, int> hash1;vector<int> ret;for(auto e : words)hash1[e]++;int len = words[0].size();for(int i = 0; i < len; i++){unordered_map<string, int> hash2;for(int left = i, right = i, count = 0; right + len <= s.size(); right += len){string in(s.substr(right, len));if(hash1.count(in) && ++hash2[in] <= hash1[in]) count++;if(right - left + len - 1>= words.size() * len){string out(s.substr(left, len));if(hash1.count(out) && hash2[out]-- <= hash1[out]) count--;left += len;}if(count == words.size())ret.push_back(left);}       }return ret;}
};

例8

76. 最小覆蓋子串

①ret = min(ret, right - left + 1), begin = left;

②if(right - left + 1 < ret)? {ret = right - left + 1;begin = left;}

①②兩段代碼是有區別的: 上面不管ret是否變化,begin就會改變

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 下面的,ret變小了才會變化

依據上面的題目知道這里的left++是不能寫在里面的

if(hash2[s[left]]-- <= hash1[s[left]]) count--;left++;

注:這里是求最小長度,那么窗口肯定是變化的,肯定是while

參考代碼

class Solution {
public:string minWindow(string s, string t) {int hash1[128] = {0}, hash2[128] = {0}, ret = INT_MAX, begin = -1;for(auto e : t)hash1[e]++;for(int left = 0, right = 0, count = 0; right < s.size(); right++){if(++hash2[s[right]] <= hash1[s[right]]) count++;while(count == t.size()){// ret = min(ret, right - left + 1), begin = left;if(right - left + 1 < ret){ret = right - left + 1;begin = left;}if(hash2[s[left]]-- <= hash1[s[left]]) count--;left++;}}return ret == INT_MAX ? "" : s.substr(begin, ret);}
};

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

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

相關文章

redis常見面試問題合集

什么是Redis&#xff1f; Redis是一個開源的、基于內存的數據結構存儲系統&#xff0c;它可以用作數據庫、緩存和消息隊列。Redis支持多種數據類型&#xff0c;包括字符串、列表、集合、有序集合和哈希表。 Redis支持的數據類型有哪些&#xff1f; Redis支持五種主要的數據類…

【LeetCode打卡】Day25|216.組合總和III、17.電話號碼的字母組合

學習目標&#xff1a; 216.組合總和III 17.電話號碼的字母組合 學習內容&#xff1a; 216.組合總和III 題目鏈接 &&文章講解 找出所有相加之和為 n 的 k 個數的組合&#xff0c;且滿足下列條件&#xff1a; 只使用數字1到9每個數字 最多使用一次 返回所有可能的有效…

集成測試之我的初步學習與總結

基本概念 將軟件集成起來后進行測試。 集成測試又叫子系統測試、組裝測試、部件測試等。集成測試主要是針對軟件高層設計進行測試&#xff0c;一般來說是以模塊和子系統為單位進行測試。 集成測試包含的層次 模塊內的集成&#xff0c;主要是測試模塊內各個接口間的交互集成…

我是如何系統自學python的,值得一看!

當然&#xff0c;我很樂意幫助你規劃一個系統的Python自學計劃。以下是我為你準備的一個簡潔、高效、實戰的Python自學指南&#xff1a; 第一步&#xff1a;基礎語法和數據結構 學習Python的基本語法&#xff0c;包括變量、數據類型、運算符、條件語句、循環語句等。理解Pyth…

day_12二叉樹理論基礎以及遍歷

第六章 二叉樹part01 今日內容&#xff1a; 理論基礎 遞歸遍歷 迭代遍歷 統一迭代 詳細布置 題目分類 二叉樹的種類 二叉樹有兩種主要的形式&#xff1a;滿二叉樹和完全二叉樹。 滿二叉樹 滿二叉樹&#xff1a;如果一棵二叉樹只有度為0的結點和度為2的結點&#xff0c;并…

java ThreadPoolExecutor 線程池

優點 ThreadPoolExecutor 提供了強大的靈活性和自定義參數的能力&#xff0c;可以根據實際需求來靈活配置線程池的行為。 位置 java.util.concurrent 包下 構造函數 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,…

進程與線程:通過實際生活來解析計算機的基本運作單位

進程與線程 進程與線程&#xff1a;詳細解析計算機的基本運作單位1. 進程&#xff1a;獨立的執行環境1.1 進程的特點&#xff1a; 2. 線程&#xff1a;輕量級的執行單元2.1 線程的特點&#xff1a; 3. 區別和聯系4. 表格 進程與線程&#xff1a;詳細解析計算機的基本運作單位 在…

Unity鉸鏈四桿機構設計和運動仿真

一、效果圖 設定好各邊長度和轉速后&#xff0c;點擊【設置并啟動】&#xff0c;自動生成一個機構模型&#xff0c;并按照原理進行運轉 二、鉸鏈四桿機構介紹 機架&#xff1a;A和D是固定位置&#xff0c;叫做機架。 曲柄&#xff1a;B點繞A點旋轉&#xff0c;構成曲柄。 連…

990-22產品經理:The benefits of business analytics 業務分析的優勢

Turning data into pound isn’t just something for big corporations now. Thanks to relatively inexpensive software and easy-to-use, drag-and-drop tools, pulling data and analysing it – with the goal of growing your business – has never been more uncomplic…

英語學習資源分享

鍵盤俠的單詞記憶軟件&#xff1a; Qwerty Learner — 為鍵盤工作者設計的單詞與肌肉記憶鍛煉軟件https://qwerty.kaiyi.cool/ 經濟學人、紐約客等英語外刊雜志下載&#xff1a;若github無法進入可以試試下載VPN插件&#xff08;在瀏覽器中安裝免費的VPN插件&#xff0c;個人推…

重拾C++之菜鳥刷算法第4篇---哈希表

一些理論知識 哈希函數是一種映射關系&#xff0c;根據關鍵詞key&#xff0c;經過一定函數關系得到元素的位置。 常見的哈希函數構造方法 直接定址法 除留余數法 疊加法 隨機數法 哈希沖突 不同關鍵字通過相同哈希函數計算出相同的哈希地址&#xff0c;該種現象稱為哈希…

視頻匯聚/存儲/壓縮/診斷平臺EasyCVR視頻聯網整合方案應用特點

隨著科技的不斷發展&#xff0c;監控視頻在各個領域的應用越來越廣泛。為了更好地管理和利用這些視頻資源&#xff0c;視頻聯網與整合的需求也越來越多。通過視頻聯網技術將不同地理位置或不同設備的視頻資源進行整合&#xff0c;實現實時共享和集中管理。視頻聯網整合方案的應…

6、云原生安全之falco的規則解讀(部分)(下)

文章目錄 3、規則解析記錄3.21、檢測是否有非特權用戶成功執行userfaultfd系統調用3.22、監控容器內通過curl/wget的下載行為3.23、檢測容器內修改release_agent文件的場景(無論修改成功與否)3.24、檢測Java進程通過網絡加載class類文件的行為,該規則用于檢測log4j的應急3.2…

Linux運維_Bash腳本_編譯安裝GNU-Tools

Linux運維_Bash腳本_編譯安裝GNU-Tools Bash (Bourne Again Shell) 是一個解釋器&#xff0c;負責處理 Unix 系統命令行上的命令。它是由 Brian Fox 編寫的免費軟件&#xff0c;并于 1989 年發布的免費軟件&#xff0c;作為 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和 …

2024最新算法:鸚鵡優化算法(Parrot optimizer,PO)求解23個基準函數

一、鸚鵡優化算法 鸚鵡優化算法&#xff08;Parrot optimizer&#xff0c;PO&#xff09;由Junbo Lian等人于2024年提出的一種高效的元啟發式算法&#xff0c;該算法從馴養的鸚鵡中觀察到的覓食、停留、交流和對陌生人行為的恐懼中汲取靈感。這些行為被封裝在四個不同的公式中…

C++_紅黑樹

目錄 1、紅黑樹的規則 2、紅黑樹節點的定義 3、紅黑樹插入節點的調整操作 3.1 情況一 3.2 情況二 3.3 情況三 4、紅黑樹的實現 結語 前言&#xff1a; 在C中&#xff0c;紅黑樹是二叉搜索樹的另一種優化版本&#xff0c;他與AVL樹的區別在于保持樹的平衡方式不同&…

【Mysql】Navicat數據庫勿刪了mysql.infoschema@localhost,導致打不開數據庫,如何修改

運行報錯如下&#xff1a; 1449 . The user specified as a definer (mysql.infoschemaocalhost) does not exist該方法不需要重啟mysql&#xff0c;或者重裝&#xff1b;僅需要恢復刪除的mysql.infoschemalocalhost用戶 一、登錄建立用戶 mysql -uroot -pxxxxxx密碼二、建立…

【網上商城系統的設計與開發】

目錄 1.實訓概況 1 1.1 實訓題目 1 1.2實訓時間 1 1.3實訓目的 1 1.4 實訓環境 1 1.5 實訓內容 2 1.6 進度安排 3 2.需求分析 5 2.1 功能需求分析 5 2.1.1用戶需求分析 5 2.2.2網站前臺需求 5 2.2.3網站后臺需求 6 2.2 可行性分析 7 2.2.1社會可行性 7 2.2.2技術可行性 8 3.系統…

Sora學習(一):Sora技術路徑整體認知

前文&#xff1a;最近跟著DataWhale組隊學習這一期“Sora原理與技術實戰”&#xff0c;本篇博客主要是基于DataWhale成員、廈門大學平潭研究院楊知錚研究員分享的Sora技術原理詳解課件內容以及參考網上一些博客資料整理而來&#xff08;詳見文末參考文獻&#xff09;&#xff0…

【談一談】并發編程_鎖的分類

【談一談】并發編程_鎖的分類 Hello!~大家好!~每天進步一點點,日復一日,我們終將問劍頂峰 這里主要是介紹下我們常用的鎖可以分為幾類,目的是整體框架作用~方便后續的并發文章 說白了,這篇就是開頭哈~ 本文總綱: 一.可重入鎖和不可重入鎖 我們開發中一般用到的都是可重入鎖比如…