coding ability 展開第四幕(滑動指針——鞏固篇)超詳細!!!!

在這里插入圖片描述

文章目錄

  • 前言
  • 水果成籃
    • 思路
  • 找到字符串中所有字母異位詞
    • 思路
  • 串聯所有單詞的子串
    • 思路
  • 最小覆蓋子串
    • 思路
  • 總結

前言

本專欄上一篇博客,帶著大家從認識滑動窗口到慢慢熟悉
相信大家對滑動窗口已經有了大概的認識
其實主要就是抓住——一段連續的區間
今天來學習一些滑動窗口進階的題目
fellow me

水果成籃

在這里插入圖片描述

思路

一開始看到這個題目,一段連續的區間,想到了滑動窗口
然后就想著怎么維護窗口,每次更新到新的水果種類就要,開始對left++,然后處理數據
其實是有點麻煩的,但是經過半個多小時的調試,最后還是ac了
思路:每次更新兩個種類的水果,x,y,如果下一個水果的種類不相符合,就更新新的x,y
這個時候 right - 1 和 right 所對應的水果就是新的兩種,然后就是處理從 left 到 right - 1這段區間
符合條件的情況, 也就是 從right - 1 一直往前走,到與 right - 1 所對應種類不同的水果,然后再更新結果
在反復進窗口,維護窗口,出窗口

代碼如下 :

class Solution
{
public:int totalFruit(vector<int>& fruits){int ans = 0;int n = fruits.size();int x = fruits[0], y = fruits[0];if (n == 1)return 1;int left = 0, right = 1;for (; right < n; right++){if (fruits[right] != x && fruits[right] != y)  // 和前面確定的水果種類{y = fruits[right - 1];		//  更新新的水果種類  x = fruits[right];int i = right - 1;if (i != left)  // left  到  right - 1  區間  {while (fruits[i] == y && i > left)  //  i一直靠近left  直到種類不同{i--;}if (i == left && y != fruits[left])  //  更新  left 的指向left++;else if (i != left)left = i + 1;}}ans = max(ans, right - left + 1);//    更新結果}return ans;}
};

后面又想到了一種思路:
就是用哈希來統計種類數量,哈希相對于前面的那種方法還是簡單的
就是把兩個種類的水果放入哈希表,然后right++ 水果進窗口,如果哈希表的水果種類大于2
就從左側 left 開始逐步出窗口,直到哈希表種類等于2,然后更新結果

代碼如下:

class Solution
{
public:int totalFruit(vector<int>& f){unordered_map<int, int> hash; // 統計窗口內出現了多少種水果int ret = 0;for (int left = 0, right = 0; right < f.size(); right++){hash[f[right]]++; // 進窗口while (hash.size() > 2) // 判斷{// 出窗口hash[f[left]]--;if (hash[f[left]] == 0)hash.erase(f[left]);left++;}ret = max(ret, right - left + 1);}return ret;}
};

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

在這里插入圖片描述

思路

看到又是一段連續的區間,就想到了滑動窗口
這一題 p 的異位詞,說白了就是包含了 p 的所有字母,不管先后順序
想到上一題用哈希優化的爽快,這題好像也可以用哈希來解
把 p 中字符都用哈希統計頻次,然后在遍歷 s 時,進窗口,維護窗口,出窗口
每次進入窗口,就用哈希統計出現次數,只要沒有到達次數上限,就進窗口
如果進入窗口的字符數量大于了 p 的長度,維護窗口從left開始往右開始出窗口
每一次統計進入窗口的數量時,都比較一下 p 的字符個數,如果進入窗口的字符個數等于 p的個數大小相等,就更新結果

代碼如下:

class Solution
{
public:vector<int> findAnagrams(string s, string p){vector<int> ret;int hash1[26] = { 0 }; // 統計字符串 p 中每個字符出現的個數for(auto ch : p) hash1[ch - 'a']++;int hash2[26] = { 0 }; // 統計窗口里面的每一個字符出現的個數int m = p.size();for(int left = 0, right = 0, count = 0; right < s.size(); right++){char in = s[right];// 進窗口 + 維護 countif(++hash2[in - 'a'] <= hash1[in - 'a']) count++;if(right - left + 1 > m) // 判斷{char out = s[left++];// 出窗口 + 維護 countif(hash2[out - 'a']-- <= hash1[out - 'a']) count--;}// 更新結果if(count == m) ret.push_back(left);}return ret;}
};

下面就上難度了嗷~~~~

串聯所有單詞的子串

在這里插入圖片描述

思路

這個題目看起來很難,其實一點也不簡單,看到困難的標簽就讓人望而生畏
但其實也沒有想象的那么難,慢慢抽絲剝繭,其實也能拿下
在這里插入圖片描述
看到這里,其實就想到了上一題的那個字母異位詞,本題是說所有單詞都包含,然后不管順序
上一題是——所有字母都包含,然后不管順序,我們不妨試試上一題的思路呢
首先要解決的就是把單詞抽象變成字符,我們可以定義一個 string,映射 int 的 哈希表,這個問題就迎刃而解了
下一個問題就是怎么才能知道哪個是單詞的開頭字母呢??又怎么在 s 中遍歷單詞然后進窗口呢??
在這里插入圖片描述
我又看到了這個條件,雪中送炭,所有單詞長度相等,那豈不是起飛了,就讓 right 每次遍歷 += 單詞長度就好了
這些都處理好了,最后一個問題就是,我怎么知道哪個字符是單詞的第一個字母,錯亂了怎么辦,那不是gg
我們只需要在外面套一層for循環,從0到單詞的長度,這段區間都做一次滑動窗口就好啦
核心問題都解決了,剩下的就是一些細節處理問題了
話不多說,這些都解決了,開始執行代碼:

class Solution 
{
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> ret;unordered_map<string, int> hash1; // 保存 words 里面所有單詞的頻次for (auto& c : words)hash1[c]++;int len = words[0].size(), m = words.size();for (int i = 0; i < len; i++) // 執行 len 次{unordered_map<string, int> hash2; // 維護窗口內單詞的頻次for (int left = i, right = i, count = 0; right + len <= s.size();right += len) {// 進窗口 + 維護 countstring in = s.substr(right, len);hash2[in]++;if (hash1.count(in) && hash2[in] <= hash1[in])count++;// 判斷if (right - left + 1 > len * m) {// 出窗口 + 維護 countstring out = s.substr(left, len);if (hash1.count(out) && hash2[out] <= hash1[out])count--;hash2[out]--;left += len;}// 更新結果if (count == m)ret.push_back(left);}}return ret;}
};

其實hard題也是由一個一個小問題糅合起來的,解決核心問題,其實也沒有那么難
慢慢啃下來,還是有成就感的 come on

最小覆蓋子串

在這里插入圖片描述

思路

又又又是一段連續的區間,來吧來吧,滑動窗口,滑動窗口
在這里插入圖片描述
這道題不是上一題的恰好涵蓋所有字符了,要返回的是最小子串,也就是能包含其他的
但是經過前面題目的磨礪,我感覺好像自己有點門道了
思路:用哈希1統計字符串 t 的每一個字符的頻次,還有種類
構造一個新的哈希2,然后遍歷 s 字符串,每個字符都統計到新的哈希表
當這個字符的頻次和 哈希1中統計的字符頻次相等時,種類數++
種類數和哈希1種類數相等時維護窗口,更新結果
大致思路就差不多是這樣,來執行代碼吧

class Solution 
{
public:string minWindow(string s, string t) {int hash1[128] = {0}; // 統計字符串 t 中每一個字符的頻次int kinds = 0;        // 統計有效字符有多少種for (auto ch : t)if (hash1[ch]++ == 0)kinds++;int hash2[128] = {0}; // 統計窗口內每個字符的頻次int minlen = INT_MAX, begin = -1;for (int left = 0, right = 0, count = 0; right < s.size(); right++) {char in = s[right];if (++hash2[in] == hash1[in])count++;           // 進窗口 + 維護 countwhile (count == kinds) // 判斷條件{if (right - left + 1 < minlen) // 更新結果{minlen = right - left + 1;begin = left;}char out = s[left++];if (hash2[out]-- == hash1[out])count--; // 出窗口 + 維護 count}}if (begin == -1)return "";elsereturn s.substr(begin, minlen);}
};

這個困難也拿下啦,滑動窗口和哈希一起用感覺有點爽,絕佳組合

總結

滑動窗口的核心在于維護一段連續區間,通過哈希表優化統計與比較過程。面對不同問題需靈活調整:
哈希表記錄元素頻次,快速判斷窗口合法性(如水果種類、異位詞)
雙指針動態伸縮窗口,確保時間復雜度為O(N)
多層循環處理定長元素(如單詞串聯),覆蓋所有起點情況
種類與頻次匹配時更新結果,最小子串問題需全局記錄最優解
掌握滑動窗口+哈希的組合,能高效解決子串、子數組等連續區間問題,突破Hard瓶頸

今天的內容就到這里啦,不要走開,小編持續更新中~~~~

在這里插入圖片描述

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

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

相關文章

圖解AUTOSAR_CP_BSW_General

AUTOSAR BSW通用規范詳解 AUTOSAR基礎軟件模塊通用規范與架構解析 目錄 1. 概述 1.1. AUTOSAR BSW通用規范簡介1.2. 文檔目的與范圍2. BSW模塊文件結構 2.1. 標準文件組織2.2. 命名規范3. BSW模塊接口 3.1. 接口類型3.2. 模塊API3.3. 配置參數4. BSW通用架構 4.1. 分層架構4.2.…

如何在Futter開發中做性能優化?

目錄 1. 避免不必要的Widget重建 問題&#xff1a;頻繁調用setState()導致整個Widget樹重建。 優化策略&#xff1a; 2. 高效處理長列表 問題&#xff1a;ListView一次性加載所有子項導致內存暴漲。 優化策略&#xff1a; 3. 圖片加載優化 問題&#xff1a;加載高分辨率…

組件通信框架ARouter原理剖析

組件通信框架ARouter原理剖析 一、前言 隨著Android應用規模的不斷擴大&#xff0c;模塊化和組件化開發變得越來越重要。ARouter作為一個用于幫助Android應用進行組件化改造的框架&#xff0c;提供了一套完整的路由解決方案。本文將深入分析ARouter的核心原理和實現機制。 二…

Netty啟動源碼NioEventLoop剖析accept剖析read剖析write剖析

學習鏈接 NIO&Netty - 專欄 Netty核心技術十–Netty 核心源碼剖析Netty核心技術九–TCP 粘包和拆包及解決方案Netty核心技術七–Google ProtobufNetty核心技術六–Netty核心模塊組件Netty核心技術五–Netty高性能架構設計 聊聊Netty那些事兒 - 專欄 一文搞懂Netty發送數…

2024年12月CCF-GESP編程能力等級認證C++編程一級真題解析

一級真題的難度: ? CCF-GESP編程能力等級認證C++編程一級真題的難度適中?。這些真題主要考察的是C++編程的基礎知識、基本語法以及簡單的算法邏輯。從搜索結果中可以看到,真題內容包括了選擇題、編程題等題型,涉及的內容如C++表達式的計算、基本輸入輸出語句的理解…

73.HarmonyOS NEXT PicturePreviewImage組件深度剖析:高級功能擴展與性能優化策略(三)

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; HarmonyOS NEXT PicturePreviewImage組件深度剖析&#xff1a;高級功能擴展與性能優化策略(三) 文章目錄 HarmonyOS NEXT PicturePreviewImage組件…

Spark 中創建 DataFrame 的2種方式對比

spark.createDataFrame(data).toDF("name", "age") 和 spark.createDataFrame(spark.sparkContext.parallelize(data), schema) 創建df的方式有什么區別&#xff1f; 在 Spark 中&#xff0c;創建 DataFrame 的方式有多種&#xff0c;其中兩種常見的方式…

六十天前端強化訓練之第十七天React Hooks 入門:useState 深度解析

歡迎來到編程星辰海的博客講解 看完可以給一個免費的三連嗎&#xff0c;謝謝大佬&#xff01; 目錄 一、知識講解 1. Hooks 是什么&#xff1f; 2. useState 的作用 3. 基本語法解析 4. 工作原理 5. 參數詳解 a) 初始值設置方式 b) 更新函數特性 6. 注意事項 7. 類組…

IEC61850標準下MMS 緩存報告控制塊 ResvTms詳細解析

IEC61850標準是電力系統自動化領域唯一的全球通用標準。IEC61850通過標準的實現&#xff0c;使得智能變電站的工程實施變得規范、統一和透明&#xff0c;這大大提高了變電站自動化系統的技術水平和安全穩定運行水平。 在 IEC61850 標準體系中&#xff0c;ResvTms&#xff08;r…

【JVM】GC 常見問題

GC 常見問題 哪些情況新生代會進入老年代 新生代 GC 后幸存區&#xff08;survivor&#xff09;不夠存放存活下來的對象&#xff0c;會通過內存擔保機制晉升到老年代。大對象直接進入老年代&#xff0c;因為大對象再新生代之間來會復制會影響 GC 性能。由 -XX:PretenureSizeT…

Audacity 技術淺析(一)

Audacity 是一個開源的音頻編輯工具&#xff0c;雖然它主要用于音頻編輯和處理&#xff0c;但也可以通過一些插件和功能實現基本的音頻生成功能。 1. Audacity 的音頻生成基礎 Audacity 的音頻生成主要依賴于其內置的生成器、效果器以及 Nyquist 編程語言。這些工具允許用戶創…

G-Star 公益行起航,揮動開源技術點亮公益!

公益組織&#xff0c;一直是社會溫暖的傳遞者&#xff0c;但在數字化浪潮中&#xff0c;也面臨著諸多比大眾想象中復雜的挑戰&#xff1a;項目管理如何更高效&#xff1f;志愿者管理又該如何創新&#xff1f;宣傳推廣怎么才能更有影響力&#xff1f;內部管理和技術支持又該如何…

MongoDB 數據導出與導入實戰指南(附完整命令)

1. 場景說明 在 MongoDB 運維中&#xff0c;數據備份與恢復是核心操作。本文使用 mongodump 和 mongorestore 工具&#xff0c;演示如何通過命令行導出和導入數據&#xff0c;解決副本集連接、路徑指定等關鍵問題。 2. 數據導出&#xff08;mongodump&#xff09; 2.1 導出命…

京東 h5st 5.1 分析

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 學習了2天某物&#xff0c;f…

CentOS 系統安裝 docker 以及常用插件

博主用的的是WindTerm軟件鏈接的服務器&#xff0c;因為好用 1.鏈接上服務器登入后&#xff0c;在/root/目錄下 2.執行以下命令安裝docker sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.reposudo…

不像人做的題————十四屆藍橋杯省賽真題解析(上)A,B,C,D題解析

題目A&#xff1a;日期統計 思路分析&#xff1a; 本題的題目比較繁瑣&#xff0c;我們采用暴力加DFS剪枝的方式去做&#xff0c;我們在DFS中按照8位日期的每一個位的要求進行初步剪枝找出所有的八位子串&#xff0c;但是還是會存在19月的情況&#xff0c;為此還需要在CHECK函數…

【redis】set 類型:基本命令

文章目錄 基本概念SADD 和 SMEMBERSSCARDSPOPSRANDMEMBERSMOVESREM集合間操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令小結內部編碼 基本概念 談到一個屬于&#xff0c;這個術語可能有多種含義&#xff0c;set 集合設置&#xff08;和 get 相對應&#xff09…

C 語言進【進階篇】之動態內存管理:從底層機制到實戰優化

目錄 &#x1f680;前言&#x1f31f;動態內存分配的必要性&#x1f914;動態內存分配函數深度剖析&#x1f4af;malloc函數&#xff1a;內存申請的主力軍&#x1f4af;free函數&#xff1a;釋放內存的“清道夫”&#x1f4af;calloc函數&#xff1a;初始化內存的利器&#x1f…

2023華東師范大學計算機復試上機真題

2023華東師范大學計算機復試上機真題 2022華東師范大學計算機復試上機真題 2021華東師范大學計算機復試上機真題 2023華東師范大學計算機復試機試真題 2022華東師范大學計算機復試機試真題 2021華東師范大學計算機復試機試真題 在線評測&#xff1a;傳送門&#xff1a;pgcode.…

Mac下安裝Zed以及Zed對MCP(模型上下文協議)的支持

Zed是當前新流行的一種編輯器&#xff0c;支持MCP&#xff08;模型上下文協議&#xff09; Mac下安裝Zed比較簡單&#xff0c;直接有安裝包&#xff0c;在這里&#xff1a; brew install --cask zedMac Monterey下是可以安裝上的&#xff0c;親測有效。 配置 使用CtrlShiftP…