leetcode 滑動窗口小結 (三)

目錄

  • 978. 最長湍流子數組
    • 題目
    • 思路分析以及代碼
  • 1052. 愛生氣的書店老板
    • 題目
    • 思考分析與初步代碼
    • 優化思路以及優化代碼
  • 1208. 盡可能使字符串相等
    • 題目
    • 思考分析以及代碼

978. 最長湍流子數組

https://leetcode-cn.com/problems/longest-turbulent-subarray/

題目

當 A 的子數組 A[i], A[i+1], …, A[j] 滿足下列條件時,我們稱其為湍流子數組:

若 i <= k < j,當 k 為奇數時, A[k] > A[k+1],且當 k 為偶數時,A[k] < A[k+1];
或 若 i <= k < j,當 k 為偶數時,A[k] > A[k+1] ,且當 k 為奇數時, A[k] < A[k+1]。
也就是說,如果比較符號在子數組中的每個相鄰元素對之間翻轉,則該子數組是湍流子數組。

返回 A 的最大湍流子數組的長度。

示例1:

輸入:[9,4,2,10,7,8,8,1,9]
輸出:5
解釋:(A[1] > A[2] < A[3] > A[4] < A[5])

示例2:

輸入:[4,8,12,16]
輸出:2

示例 3:

輸入:[100]
輸出:1

提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9

思路分析以及代碼

這一題是典型的滑動窗口問題。
我的大致思路如下:
1、獲取差分數組
2、從左到右比對差分數組,觀察相鄰兩個元素是否異號(一個大于0 ,一個小于0;或者相反)
3、如果異號,說明符合條件;更新窗口值,右邊界繼續擴展
4、否則,說明當前[left,right)中都不符合條件,需要直接將左邊界更新到原有的右邊界。
5、意外情況:下面有幾種意外情況我是特殊處理的

1、原數組小于等于1,直接返回數組大小
2、如果差分數組中全部都是0,此時返回1

class Solution {
public:int juge(int a , int b){if((a > 0 && b < 0) || (a < 0 && b >0)) return true;else return false;}int maxTurbulenceSize(vector<int>& arr) {if(arr.size() <= 1) return arr.size();int n = arr.size();vector<int> diff(n - 1);for(int i = 0; i < n - 1; i++){diff[i] = arr[i+1] - arr[i];}int left = 0 ,right = 1;int max_window_size = 1;int zero_diff_times = 0;if(diff[0] == 0) zero_diff_times++;while(right < diff.size()){if(juge(diff[right],diff[right - 1])){max_window_size = max(max_window_size,right - left + 1);}else{if(diff[right] == 0) zero_diff_times++;left = right;}right++;}if(zero_diff_times == diff.size()) return 1;return max_window_size+1;}
};

1052. 愛生氣的書店老板

https://leetcode-cn.com/problems/grumpy-bookstore-owner/

題目

今天,書店老板有一家店打算試營業 customers.length 分鐘。每分鐘都有一些顧客(customers[i])會進入書店,所有這些顧客都會在那一分鐘結束后離開。

在某些時候,書店老板會生氣。 如果書店老板在第 i 分鐘生氣,那么 grumpy[i] = 1,否則 grumpy[i] = 0。 當書店老板生氣時,那一分鐘的顧客就會不滿意,不生氣則他們是滿意的。

書店老板知道一個秘密技巧,能抑制自己的情緒,可以讓自己連續 X 分鐘不生氣,但卻只能使用一次。

請你返回這一天營業下來,最多有多少客戶能夠感到滿意的數量。
示例:

輸入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
輸出:16
解釋:
書店老板在最后 3 分鐘保持冷靜。
感到滿意的最大客戶數量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.

提示:

1 <= X <= customers.length == grumpy.length <= 20000
0 <= customers[i] <= 1000
0 <= grumpy[i] <= 1

思考分析與初步代碼

初步思路:
1、從第一個時間段開始遍歷,遍歷每個窗口長度為X的時間段,并且計算這個時間段內老板生氣的時間顧客來的人數。
2、依次遍歷完整個時間段,找到時間段內老板生氣的時間顧客來的人數最多的人數。
3、最后再遍歷一遍原數組,記錄下老板不生氣時候來的總人數
4、兩個結果相加,得到最終結果。

class Solution {
public:int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {int max_sum_start = 0;int max_sum = 0;for(int start = 0; start < customers.size() - X + 1; start++){int sum = 0;for(int i = start; i < start + X ; i ++){if(grumpy[i] == 1) sum += customers[i];}if(sum >= max_sum){max_sum = sum;max_sum_start = start;}}//cout << "max_sum= " << max_sum << endl;int result = 0;for(int i = 0; i < customers.size(); i++){if(grumpy[i] == 0) result+=customers[i];}return result+max_sum;}
};

很顯然時間復雜度是O(N * X)

優化思路以及優化代碼

關于長度固定的滑動窗口,有一點我們要熟悉的是,窗口每次滑動時,變化的只有頭尾兩個元素,所以我們只針對這兩個元素進行處理就行。
不過對于第一個窗口需要特殊對待,需要先進行填充。
接下來的窗口中,如果新進來的時間是生氣的,加上顧客量。如果新出去的時間是生氣的,那么減去顧客量。每次滑動都需要更新最大值。

class Solution {
public:int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {int sum = 0;//計算不生氣時來的顧客總數for(int i = 0; i < customers.size(); i++){if(grumpy[i] == 0) sum+=customers[i];}int left = 0, right = 0;//第一個區域while(right < X){if(grumpy[right] == 1) sum += customers[right];right++;}int max_sum = sum;while(right < customers.size()){//生氣的時間段被移除窗口,總顧客減少if(grumpy[left] == 1)   sum -= customers[left];//生氣的時間段被移入窗口,總顧客增加if(grumpy[right] == 1) sum += customers[right];max_sum = max(max_sum,sum);left++;right++;}return max_sum;}
};

1208. 盡可能使字符串相等

題目

給你兩個長度相同的字符串,s 和 t。

將 s 中的第 i 個字符變到 t 中的第 i 個字符需要 |s[i] - t[i]| 的開銷(開銷可能為 0),也就是兩個字符的 ASCII 碼值的差的絕對值。

用于變更字符串的最大預算是 maxCost。在轉化字符串時,總開銷應當小于等于該預算,這也意味著字符串的轉化可能是不完全的。

如果你可以將 s 的子字符串轉化為它在 t 中對應的子字符串,則返回可以轉化的最大長度。

如果 s 中沒有子字符串可以轉化成 t 中對應的子字符串,則返回 0。

示例 1:

輸入:s = “abcd”, t = “bcdf”, cost = 3
輸出:3
解釋:s 中的 “abc” 可以變為 “bcd”。開銷為 3,所以最大長度為 3。

示例 2:

輸入:s = “abcd”, t = “cdef”, cost = 3
輸出:1
解釋:s 中的任一字符要想變成 t 中對應的字符,其開銷都是 2。因此,最大長度為 1。

示例 3:

輸入:s = “abcd”, t = “acde”, cost = 0
輸出:1
解釋:你無法作出任何改動,所以最大長度為 1。

提示:

1 <= s.length, t.length <= 10^5
0 <= maxCost <= 10^6
s 和 t 都只含小寫英文字母。

思考分析以及代碼

這一題是一個非常典型的滑動窗口題。
1、首先我們構建差分絕對值數組:

vector<int> diff(s.size());
for(int i = 0; i < diff.size(); i++)
{diff[i] = abs(s[i] - t[i]);
}

2、然后,我們建立滑動窗口的左右邊界,在差分數組上移動
3、什么時候擴展窗口?
當我們現在存有的cost - 右邊新納入的cost >= 0 的時候,我們可以繼續擴展窗口
4、反之,如果小于0,說明不能繼續擴展了。但是由于我們求的是最大窗口長度,所以此時也不需要縮小窗口,只需要將整個窗口平移即可。記住平移的時候,要將新移除的cost加到當前cost上,算是彌補損失。
5、更新窗口最大長度的操作必然是在擴展窗口的時候啦
這一題思路應該還是比較清晰的。當然也有個地方有點不好搞,那就是第三點是>0 還是 >=0.如果有時間的話,可以自己手動推導一下,如果沒有就兩個都試一下,選擇答案正確的即可.

class Solution {
public:int equalSubstring(string s, string t, int maxCost) {//構建相差數組vector<int> diff(s.size());for(int i = 0; i < diff.size(); i++){diff[i] = abs(s[i] - t[i]);}int left = 0, right = 0;int max_length = 0;while(right < diff.size()){//擴大窗口int new_In = diff[right];maxCost = maxCost - new_In;if(maxCost >= 0){max_length = max(max_length,right -left + 1);}else{int new_Out = diff[left];maxCost += new_Out;left++;}right++;}return max_length;}
};

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

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

相關文章

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;就在剛才…

c# datetime._C#| DateTime.Month屬性與示例

c# datetime.DateTime.Month屬性 (DateTime.Month Property) DateTime.Month Property is used to get the month component of this object. Its a GET property of DateTime class. DateTime.Month屬性用于獲取此對象的月份組成部分。 這是DateTime類的GET屬性。 Syntax: 句…

C++ 內存分配層次以及memory primitives的基本用法

分配層次 C memory primitives 分配釋放類型是否可重載mallocfree()C函數不可newdeleteC表達式不可::operator new()::operator delete()C函數可allocator::allocate()allocator::deallocate()C標準庫可自由設計并以之搭配任何容器 分配與釋放的四個用法 1、malloc and delet…

jQuery easyui layout布局自適應瀏覽器大小

首先解釋一下標題的含義&#xff0c;當我們用jQuery easyui layout 進行布局的時候&#xff0c;可能會遇到這樣一個問題&#xff0c;那就是當手工調整瀏覽器大小&#xff0c;或者最大化、還原窗口的時候&#xff0c;layout的某個區域不能填充因為瀏覽器擴大而產 生的空白區域&a…