算法 —— 滑動窗口

目錄

長度最小的子數組

無重復字符的最長子串?

最大連續1的個數

將x減到0的最小操作數

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


長度最小的子數組

sum比target小就進窗口,sum比target大就出窗口,由于數組是正數,所以相加會使sum變大,相減會使sum變小,至于為什么可以這樣做,這其實是在暴力枚舉的基礎上進行了優化,例如2,3,1,2相加等于8已經超過target,這樣就不需要繼續加后面的4,3,因為此時已經滿足條件,我們要做的是在滿足要求的基礎上使len盡量小。?

代碼實現如下:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int sum = 0, len = INT_MAX, n = nums.size();for (int right = 0, left = 0; right < n; right++){sum += nums[right]; // 進窗口while (sum >= target) // 判斷{len = min(len, right - left + 1); // 更新結果sum -= nums[left++]; // 出窗口}}return len == INT_MAX ? 0 : len;}
};

無重復字符的最長子串?

利用哈希表記錄字符個數,注意本題字符包括數字,字母及空格,意味著我們要開一個128大小的數組。代碼實現如下:

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128] = { 0 }; // 使用數組來模擬哈希表int n = s.size(), len = 0;for (int left = 0, right = 0; right < n;right++){hash[s[right]]++; // 進窗口while (hash[s[right]] == 2) // 判斷{hash[s[left++]]--; // 出窗口}len = max(len, right - left + 1); // 更新結果}return len;}
};

最大連續1的個數

和上題類似,通過滑動窗口,調節0的個數,最關鍵的在于將題目意思轉換為找不超過k個0的子數組,如果超過k就出窗口,未超過就進窗口,代碼實現如下:

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int zero = 0, len = 0; // 計數器for (int left = 0, right = 0; right < nums.size(); right++){if (nums[right] == 0) // 進窗口zero++; // 計數while (zero > k) // 判斷{if (nums[left] == 0)zero--;left++; // 出窗口}len = max(len, right - left + 1);}return len;}
};

將x減到0的最小操作數

本題思想為正難則反,如果題目正向思考困難,可以從另外一方面思考,例如本題要找最短長度,且元素可能在左右端口出現,另外最短長度數組元素之和剛好為x,這個代碼實現起來過于麻煩,可以想找一個最長長度的子數組,使他元素之和剛好為sum - x,這樣又轉化為滑動窗口問題。

注意:len不能設置為0,因為有可能整個數組都是構成x的元素,最終判斷是否存在時不能用len == 0 這個判斷式來判斷數組是否存在子數組可以將x減到0,應當設置為-1。另外,該題只有在sum2 == target時才能更新結果,否則不更新。代碼如下:

class Solution {
public:int minOperations(vector<int>& nums, int x) {// 記算整個數組的和int sum1 = 0, n = nums.size();for (auto e : nums){sum1 += e;}// 找出最長子數組的和 sum1 - xint target = sum1 - x, len = -1, sum2 = 0;// 處理細節問題if (target < 0)return -1;// 滑動窗口解決問題for (int left = 0, right = 0; right < n; right++){sum2 += nums[right]; // 進窗口while (sum2 > target) // 判斷sum2 -= nums[left++]; // 出窗口if (sum2 == target)len = max(len, right - left + 1); // 更新結果}if (len == -1)return len;elsereturn n - len;}
};

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

在更新結果時不需要遍歷兩個哈希表,通過count計數器來判斷hash2里的有效個數是否和m相等即可,代碼實現如下:

class Solution {
public:vector<int> findAnagrams(string s, string p) {int hash1[26] = { 0 }, hash2[26] = { 0 }, n = s.size(), m = p.size();// 統計 p 的每個字符出現的次數for (auto e : p)hash1[e - 'a']++;vector<int> ret;// 統計 s 的每個字符出現的次數for (int left = 0, right = 0,count = 0; right < n; 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']) // 出窗口 + 維護 countcount--;}// 更新結果if (count == m)ret.push_back(left);}return ret;}
};

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

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

相關文章

關于redis的運維面試題-1

1. 什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的內存數據結構存儲&#xff0c;通常用作數據庫、緩存和消息代理。它支持多種數據結構&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff0…

大二暑假 + 大三上

希望&#xff0c;暑假能早睡早起&#xff0c;胸圍達到 95&#xff0c;腰圍保持 72&#xff0c;大臂 36&#xff0c;小臂 32&#xff0c;小腿 38&#x1f36d;&#x1f36d; 目錄 &#x1f348;暑假計劃 &#x1f339;每周進度 &#x1f923;寒假每日進度&#x1f602; &…

DiskGeniusV5.6.0.1565發布!

DiskGenius是一款功能強大的磁盤管理和數據恢復工具&#xff0c;V5.6.0.1565上線。新版本變化比較大&#xff0c;增加新的功能&#xff0c;修正已經問題&#xff0c;值得試一下。提醒大家&#xff0c;磁盤管理軟件涉及數據安全&#xff0c;請始終使用最新版本&#xff01; 下面…

JS hook

參照&#xff1a; JS 逆向之 Hook JS Hook 與 過 debugger 一、常用Hook 1. eval (function() {let _eval eval;eval function(val) {if (val.indexof(debugger) -1) {_eval_cache(obj);}} })(); 2. JSON.parse() (function () {var parse_ JSON.parse;JSON.parse …

C++ initializer_list類型推導

目錄 initializer_list C自動類型推斷 auto typeid decltype initializer_list<T> C支持統一初始化{ }&#xff0c;出現了一個新的類型initializer_list<T>&#xff0c;一切類型都可以用列表初始化。提供了一種更加靈活、安全和明確的方式來初始化對象。 class…

IO-Link OD介紹

IO-Link OD&#xff08;On-request Data&#xff0c;按需數據&#xff09;是IO-Link通信中的一種重要數據類型&#xff0c;主要用于參數讀寫、指令交互、事件上傳等動作。以下是關于IO-Link OD的結構、構成以及功能使用的詳細說明&#xff1a; 結構與構成 定義&#xff1a;OD…

堆排序(Heap Sort)

堆排序是一種高效的排序算法&#xff0c;它利用了堆的數據結構來實現。堆是一種特殊的完全二叉樹&#xff0c;分為最大堆和最小堆兩種類型。在最大堆中&#xff0c;父節點的值大于等于其子節點的值&#xff1b;而在最小堆中&#xff0c;父節點的值小于等于其子節點的值。 堆排…

【C命名規范】遵循良好的命名規范,提高代碼的可讀性、可維護性和可復用性

/******************************************************************** * brief param return author date version是代碼書寫的一種規范 * brief &#xff1a;簡介&#xff0c;簡單介紹函數作用 * param &#xff1a;介紹函數參數 * return&#xff1a;函數返回類型說明 * …

同一個excel表格,為什么在有的電腦上會顯示#NAME?

一、哪些情況會產生#NAME?的報錯 1.公式名稱拼寫錯誤 比如求和函數SUM&#xff0c;如果寫成SUN就會提示#NAME&#xff1f;報錯。 2.公式中的文本值未添加雙引號 如下圖&#xff1a; VLOOKUP(丙,A:B,2,0) 公式的計算結果會返回錯誤值#NAME?&#xff0c;這是因為公式中文本…

【PLC】三菱PLC如何和匯川伺服實現485通信

前言 一開始選用的是匯川SV660P脈沖型伺服&#xff0c;由于生產需求需要對伺服的個別參數進行讀取和寫入操作&#xff0c;但是SV660P并不支持這種情況&#xff0c;因此需要使用485通信來滿足。PLC這邊選用的是三菱FX5U。 開始 1、首先準備按照下圖的引腳提示準備好一根帶屏蔽…

全志H616交叉編譯工具鏈的安裝與使用

交叉編譯的概念 1. 什么是交叉編譯&#xff1f; 交叉編譯是指在一個平臺上生成可以在另一個平臺上運行的可執行代碼。例如&#xff0c;在Ubuntu Linux上編寫代碼&#xff0c;并編譯生成可在Orange Pi Zero2上運行的可執行文件。這個過程是通過使用一個專門的交叉編譯工具鏈來…

(七)glDrawArry繪制

幾何數據&#xff1a;vao和vbo 材質程序&#xff1a;vs和fs(頂點著色器和片元著色器) 接下來只需要告訴GPU&#xff0c;使用幾何數據和材質程序來進行繪制。 #include <glad/glad.h>//glad必須在glfw頭文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…

程序員接單服務話術

進入群聊開始服務時&#xff1a; 尊敬的客戶您好&#xff0c;我程序員&#xff1a;xx 很榮幸為您服務 我擅長xx領域 接下來我們一起對接下詳細需求&#xff0c;我將根據您的任務需求難度給您匯報開發所需時長及報價。預祝我們合作愉快。 報價后且客戶接受時&#xff1a; 您好…

PostgreSQL的學習心得和知識總結(一百四十七)|深入理解PostgreSQL數據庫之transaction chain的使用和實現

目錄結構 注&#xff1a;提前言明 本文借鑒了以下博主、書籍或網站的內容&#xff0c;其列表如下&#xff1a; 1、參考書籍&#xff1a;《PostgreSQL數據庫內核分析》 2、參考書籍&#xff1a;《數據庫事務處理的藝術&#xff1a;事務管理與并發控制》 3、PostgreSQL數據庫倉庫…

2024年文化傳播與對外交流國際學術會議(ICCCFE 2024)

2024年文化傳播與對外交流國際學術會議&#xff08;ICCCFE 2024&#xff09; 2024 International Conference on Cultural Communication and Foreign Exchange(ICCCFE 2024) 會議簡介&#xff1a; 2024年文化傳播與對外交流國際學術會議&#xff08;ICCCFE 2024&#xff09;定…

clion開發51 沒有創建成功可能是Clion版本問題

安裝插件 PlatformlO for CLion 進入這個網站下載get-platformio.py https://docs.platformio.org/en/latest/core/installation/methods/installer-script.html#local-download-macos-linux-windows 點擊 Installation Methods 選擇 Local Download (macOS/Linux/Windows) 點…

linux指令gzip

gzip 是 Linux 系統中廣泛使用的一個文件壓縮和解壓縮程序。它使用 Lempel-Ziv 編碼&#xff08;LZ77&#xff09;和 Huffman 編碼的組合來壓縮文件&#xff0c;減少磁盤使用空間和網絡傳輸時間。以下是對 gzip 命令的一些基本使用說明和示例&#xff0c;這些示例旨在幫助你了解…

小阿軒yx-案例:MySQL主從復制與讀寫分離

小阿軒yx-案例&#xff1a;MySQL主從復制與讀寫分離 案例分析 概述 實際生產環境中 如果對數據庫讀和寫都在同一個數據庫服務器中操作&#xff0c;無論在安全性、高可用性還是高并發等各個方面都完全不能滿足實際需求一般都是通過主從復制&#xff08;Master-Slave&#xf…

MSPG3507——藍牙接收數據顯示在OLED,滴答定時器延時500MS

#include "ti_msp_dl_config.h" #include "OLED.h" #include "stdio.h"volatile unsigned int delay_times 0;//搭配滴答定時器實現的精確ms延時 void delay_ms(unsigned int ms) {delay_times ms;while( delay_times ! 0 ); } int a0; …

4.自動生成class和device

第三章里面&#xff0c;我們使用mknod創建設備節點&#xff0c;常規操作是在驅動init的時候就創建好&#xff0c;使用class_create和device_create創建。 #include "asm/uaccess.h" #include "linux/scatterlist.h" #include "linux/types.h" #…