算法2:滑動窗口(下)

文章目錄

  • 水果成籃
  • 找到字符串中所有字母異位詞
  • 串聯所有單詞的子串*
  • 最小覆蓋子串*

水果成籃

在這里插入圖片描述
兩元素排空操作
窗口中存在元素交錯情況,所以出窗口一定要出干凈!!!

class Solution {
public:int totalFruit(vector<int>& fruits) {unordered_map<int, int> hash; // 統計水果情況int res = 0;for (int left = 0, right = 0; right < fruits.size(); right++) {hash[fruits[right]]++;  // 進窗口while (hash.size() > 2) // 判斷{// 出窗口hash[fruits[left]]--;if (hash[fruits[left]] == 0)hash.erase(fruits[left]);left++;}res = max(right - left + 1, res);}return res;}
};

優化:

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001] = {0}; // 統計水果情況int res = 0;for (int left = 0, right = 0, kinds = 0; right < fruits.size();right++) {if (hash[fruits[right]] == 0)kinds++;           // 維護水果種類hash[fruits[right]]++; // 進窗口while (kinds > 2)      // 判斷{// 出窗口hash[fruits[left]]--;if (hash[fruits[left]] == 0)kinds--;left++;}res = max(right - left + 1, res);}return res;}
};

技巧:數據有限的情況下,用數組比用容器快很多

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

在這里插入圖片描述

class Solution {
public:vector<int> findAnagrams(string s, string p) {if (s.size() < p.size())return {};vector<int> res;long long sum = 0;for (auto e : p)sum += (e - '0') * (e - '0') * (e - '0');int left = 0, right = 0;long long target = 0;while (right < s.size()) {target += (s[right] - '0') * (s[right] - '0') * (s[right] - '0');while (target >= sum && left <= right) {if (target == sum && right - left == p.size() - 1)res.push_back(left);target -= (s[left] - '0') * (s[left] - '0') * (s[left] - '0');left++;}right++;}return res;}
};
class Solution {
public:vector<int> findAnagrams(string s, string p) {if (s.size() < p.size())return {};int hash1[26] = {0};for (auto e : p)hash1[e - 'a']++;vector<int> res;int hash2[26] = {0};int m = p.size();for (int left = 0, right = 0, count = 0; right < s.size(); right++) {char in = s[right];if (++hash2[in - 'a'] <= hash1[in - 'a']) // 進窗口及維護countcount++;if (right - left + 1 > m) // 判斷{char out = s[left++];if (hash2[out - 'a']-- <= hash1[out - 'a'])count--; // 出窗口及維護count}// 結果更新if (count == m)res.push_back(left);}return res;}
};

串聯所有單詞的子串*

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {int slen = s.size(), plen = words.size(), _size = words[0].size();plen *= _size;if (plen == 0 || slen < plen)return {};// 滑動窗口+哈希表vector<int> res;unordered_map<string, int> aCount;for (auto& e : words)aCount[e]++;unordered_map<string, int> bCount;int n = words[0].size();while (n--) /// 執行n次滑動窗口{for (int left = n, right = n, count = 0; right + _size <= s.size();right += words[0].size()) {string in = s.substr(right, words[0].size());bCount[in]++;// if(aCount[in] && bCount[in] <= aCount[in])   count++;if (aCount.count(in) && bCount[in] <= aCount[in])count++;// 這里窗口的長度是right + len -left,// 也就是說窗口的長度已經大于words的總體長度if (right - left == words[0].size() * words.size()) {string out = s.substr(left, words[0].size());// 這里用[]會影響速度,用哈希的計數函數快一些// count函數的返回值是0或1// ,類似于bool值,表示其是否存在,而[]返回的是次數,就涉及到了查找,故花費時間較長if (aCount.count(out) && bCount[out] <= aCount[out])count--;// if(aCount[out] && bCount[out] <= aCount[out]) count--;bCount[out]--;left += words[0].size();}if (count == words.size())res.push_back(left);}bCount.clear();}return res;}
};```cpp
class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> result;if (s.empty() || words.empty())return result;int word_length = words[0].length();int num_words = words.size();int total_length = word_length * num_words;unordered_map<string, int> word_count;for (const string& word : words) {word_count[word]++;}for (int i = 0; i < word_length; ++i) {int left = i, right = i;unordered_map<string, int> window_count;while (right + word_length <= s.length()) {string word = s.substr(right, word_length);right += word_length;if (word_count.find(word) != word_count.end()) {window_count[word]++;while (window_count[word] > word_count[word]) {string left_word = s.substr(left, word_length);window_count[left_word]--;left += word_length;}if (right - left == total_length) {result.push_back(left);}} else {window_count.clear();left = right;}}}return result;}
};

兩段代碼都是:哈希+滑動窗口,時間空間復雜度也一樣,但是測試時間卻減少了許多,可以對比一下第二段代碼優于第一段代碼的點在哪里?

最小覆蓋子串*

在這里插入圖片描述

在這里插入圖片描述

class Solution {
public:string minWindow(string s, string t) {string res;int hash[128] = {0};int tt = 0; // 字符種類for (char& e : t)if (0 == hash[e]++)tt++;int hash1[128] = {0};int begin = -1, m = INT_MAX;for (int left = 0, right = 0, count = 0; right < s.size(); right++) {// 進窗口char in = s[right];if (++hash1[in] == hash[in])count++;//  檢查while (count == tt) {//  更新if (right - left + 1 < m) {begin = left;m = right - left + 1;}//  出窗口char out = s[left++];if (hash1[out]-- == hash[out])count--;}}if (begin != -1)res = s.substr(begin, m);return res;}
};
//  "ADOBEC"

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

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

相關文章

【瀑布模型概述】

文章目錄 前言一、什么是瀑布模型&#xff1f;二、瀑布模型的階段1. 需求分析&#xff08;Requirements Analysis&#xff09;2. 系統設計&#xff08;System Design&#xff09;3. 實現&#xff08;Implementation&#xff09;4. 測試&#xff08;Testing&#xff09;5. 部署&…

行心科技中祿松波攜手,開啟智能健康新時代

在2024年第34屆健博會暨中國大健康產業文化節的盛大舞臺上&#xff0c;廣州市行心信息科技有限公司&#xff08;以下簡稱“行心科技”&#xff09;與浙江中祿松波生物工程有限公司&#xff08;以下簡稱“中祿松波”&#xff09;宣布達成戰略合作&#xff0c;共同推動醫康養產業…

[職場] 美術指導的重要作用 #學習方法#筆記

美術指導的重要作用 美術指導是廣告、電影、電視劇等創意作品中的一個重要角色&#xff0c;負責整體視覺風格和美術設計的指導和管理。 美術指導的目標是通過視覺表達來傳達故事的情感、氛圍和主題&#xff0c;以及塑造角色和場景的形象。 美術指導在創作過程中扮演著重要的角…

Linux網絡的DHCP配置

文章目錄 DHCP配置DHCP流程簡述DHCP優點DHCP的分配方式DHCP的租約過程DHCP配置實驗實驗1實驗2 DHCP配置 DHCP&#xff1a;動態主機配置協議 服務端和客戶端 服務端&#xff1a;server&#xff0c;提供某種特定的服務 客戶端&#xff1a;client&#xff0c;使用服務端提供的服…

深度學習 - 梯度下降優化方法

梯度下降的基本概念 梯度下降&#xff08;Gradient Descent&#xff09;是一種用于優化機器學習模型參數的算法&#xff0c;其目的是最小化損失函數&#xff0c;從而提高模型的預測精度。梯度下降的核心思想是通過迭代地調整參數&#xff0c;沿著損失函數下降的方向前進&#…

人體感應提醒 大聲公+微波模塊

文章目錄 模塊簡介接線程序示例 模塊簡介 微波感應開關模塊 RCWL-0516是一款采用多普勒雷達技術&#xff0c;專門檢測物體移動的微波感應模塊。采用 2.7G 微波信號檢測&#xff0c;該模塊具有靈敏度高&#xff0c;感應距離遠&#xff0c;可靠性強&#xff0c;感應角度大&#…

Ruoyi-Vue-Plus 下載啟動后菜單無法點擊展開,

1.Ruoyi-Vue-Plus框架下載后運行 2.使用mock數據 3.進入頁面后無法點擊菜單 本以為是動態路由或者菜單邏輯出了問題&#xff0c;最后發現是websocket的問題 解決辦法 把這兩行代碼注釋 頁面菜單即可點擊。 以上。

【ROS使用記錄】—— ros使用過程中的rosbag錄制播放和ros話題信息相關的指令與操作記錄

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、rosbag的介紹二、rosbag的在線和離線錄制三、rosbag的播放相關的指令四、其他rosbag和ros話題相關的指令總結 前言 rosbag是ROS&#xff08;機器人操作系統…

Suse Linux ssh配置免密后仍需要輸入密碼

【問題描述】 Suse Linux已經配置了ssh免密&#xff0c;但無法ssh到目標服務器。 對自身的ssh登陸也需要輸入密碼。 系統–Suse 15 SP5 【重現步驟】 1.使用ssh-keygen -t rsa生產key文件 2.使用ssh-copy-id拷貝public key到目標機器(或者自身) 3.配置成功后ssh 目標時仍需要輸…

電商API在維護數據安全與合規性中的重要性

摘要 在數字化時代&#xff0c;數據安全和合規性是電商企業不可忽視的重大議題。本文將探討電商API如何在保護敏感數據、遵守法律法規和防范網絡威脅方面發揮關鍵作用。 引言 隨著大量敏感數據的電子化處理和存儲&#xff0c;電商企業面臨的安全挑戰日益嚴峻。API接口技術成為…

手機模擬操作進階:1.某團獲取附近商店情況

0.以超市便利為例分析: 超市便利的xp (//android.widget.ImageView[@resource-id="com.sankuai.meituan:id/channel_icon"])[5] 附近的xp //android.widget.TextView[@text="全部200+店"] 商家信息列表區: //android.support.v7.widget.RecyclerView[@…

《青少年編程與數學》課程方案:2、課程內容 4_4

《青少年編程與數學》課程方案&#xff1a;2、課程內容 4_4 十四、數學&#xff08;三&#xff09;高中數學&#xff08;四&#xff09;微機分&#xff08;五&#xff09;線性代數&#xff08;六&#xff09;概率論與數理統計&#xff08;七&#xff09;離散數學&#xff08;八…

娛閑放鬆篇1

最近在B站看了挺多的動漫,挺小說化的,我這個人比較哲學,故和大家分享一下 B站娛閑 1.蘇老大的動漫 1.<<人類清除計劃>> 本來看的過癮,但沒想到,連小說也停更了..... 2.黑山羊遊戲 挺劇本的 3.顧毅 一個小說的主人公,第一個能力是無限推演... 崇山醫…

[C#]使用OpenCvSharp圖像濾波中值濾波均值濾波高通濾波雙邊濾波銳化濾波自定義濾波

在使用OpenCvSharp進行圖像濾波處理時&#xff0c;各種濾波方法都有其特定的用途和效果。以下是對中值濾波、均值濾波、高通濾波、雙邊濾波、銳化濾波和自定義濾波的詳細解釋和歸納&#xff1a; 中值濾波&#xff08;MedianBlur&#xff09; 原理與作用&#xff1a;中值濾波是…

Stable diffusion采樣器詳解

在我們使用SD web UI的過程中&#xff0c;有很多采樣器可以選擇&#xff0c;那么什么是采樣器&#xff1f;它們是如何工作的&#xff1f;它們之間有什么區別&#xff1f;你應該使用哪一個&#xff1f;這篇文章將會給你想要的答案。 什么是采樣&#xff1f; Stable Diffusion模…

UI學習--導航控制器

導航控制器 導航控制器基礎基本概念具體使用 導航控制器切換演示具體使用注意 導航欄與工具欄基本概念具體使用&#xff1a; 總結 導航控制器基礎 基本概念 根視圖控制器&#xff08;Root View Controller&#xff09;&#xff1a;導航控制器的第一個視圖控制器&#xff0c;通…

壓縮大文件消耗電腦CPU資源達到33%以上

今天用7-Zip壓縮一個大文件&#xff0c;文件大小是9G多&#xff0c;這時能聽到電腦風扇聲音&#xff0c;查看了一下電腦資源使用情況&#xff0c;確實增加了不少。 下面是兩張圖片&#xff0c;圖片上有電腦資源使用數據。

Spring系統學習 -Spring IOC 的XML管理Bean之bean的獲取、依賴注入值的方式

在Spring框架中&#xff0c;XML配置是最傳統和最常見的方式之一&#xff0c;用于管理Bean的創建、依賴注入和生命周期等。這個在Spring中我們使用算是常用的&#xff0c;我們需要根據Spring的基于XML管理Bean了解相關Spring中常用的獲取bean的方式、依賴注入值的幾種方式等等。…

c++ namespace以及使用建議

命名空間就是用來區分你使用的這個變量和函數是屬于那一塊的。用來防止不同的人所寫函數和變量&#xff0c;名字相同產生沖突。 在寫c代碼的時候&#xff0c;經常會使用標準庫中的函數&#xff0c;使用之前我們必須在前面添加一個std::&#xff0c;因為c標準庫的函數是在命名空…

關閉Cloudflare Pages的訪問策略

curl API 獲取相應的 uid curl -X GET "https://api.cloudflare.com/client/v4/accounts/賬戶標識符/access/apps" \-H "X-Auth-Email: 郵箱" \-H "X-Auth-Key: Global API KEY" \-H "Content-Type: application/json"賬戶標識符是登…