演算法 滑動視窗演算法總結

2021-10-04 07:31:58 字數 1919 閱讀 9283

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

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

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

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

思路: 總和分成前後兩部分a和b。a部分是從0到位置i的掃瞄和。b部分是從位置i+1的字尾和。求a+b的最大和即可。

例如:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], x = 3

先求字尾和 s=[ 10 9 9 8 8 7 7 0 ]

那麼,b=s[i+1]。

用滑動視窗求a部分。視窗右滑時,加上進入視窗的值,減去出視窗的值。

整體思路:

求字尾和s;

w = 0; 視窗值

ans = 0;結果

for(i < n)

ans = max(ans, w + s[i+1]);

}

思路:結果分成兩部分。不生氣時的人數一定要全部累加上。此時,只需要求出視窗中,生氣時的最大人數和即可。用滑動視窗法求視窗中生氣時的最大人數和。

例如:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], x = 3

不生氣的位置 [1,0,1,2,1,1,7,5]

不生氣的總人數 = 1 + 1 + 1 + 7 = 10

視窗中生氣的人數 最大的位置 [1,0,1,2,1,1,7,5]

視窗中生氣的最大人數和 = 1+5 = 6

思路:

w = 0;視窗值;

max_w = 0;最大視窗值;

ans = 0;結果值;

for(i < n)

max_w = max(max_w, w);

}ans+ max_w是結果;

初始版本:

int maxsatisfied(vector& customers, vector& grumpy, int x) 

max_w = max(max_w,w);

}return ans + max_w;

}

自己的:

class solution {

public:

int maxsatisfied(vector& customers, vector& grumpy, int x) {

int satisfynum = 0;

//int unsatisfynum = 0; //放到迴圈裡,每次初始化

int length = customers.size();

int maxunsatufy = 0;

int window = 0;//初始視窗值

//step 1 ,求出正常情況的滿意顧客總數,和初始視窗數

滑動視窗演算法總結

我是會寫bug的子晗,生命不止,演算法永不息!昨天晚上,閒來無事去學校acm隊訓練機房呆了一會,太受刺激了,大一的把我摁在地上摩擦,屬實很拉,學習了乙個滑動視窗演算法。唉,現在演算法剛開課,之前自己也學過一段時間,但刷體很少。以後晚上得經常去跟著他們一起去訓練了,這種行為我願稱之為 偷學 手動滑稽 ...

滑動視窗演算法

我們學習過計算機網路都知道為了避免擁塞發生,在網路傳輸時有滑動視窗協議控制傳輸時流量。該協議允許傳送方在停止並等待確認前傳送多個資料分組。由於傳送方不必每發乙個分組就停下來等待確認,因此該協議可以加速資料的傳輸,提高網路吞吐量。這個跟我們今天說的滑動視窗演算法是乙個原理。該演算法的作用就是將我們多層...

滑動視窗演算法

在letecode程式設計中經常會碰到一類尋找最長序列的問題,這個時候都可以採用滑動視窗的演算法 滑動視窗就是控制乙個雙指標left,right,沒有達到極限條件的時候right指標,操作臨界條件 就讓left指標,然後更新這個最長序列。比如下面的的問題 問題一 給你兩個長度相同的字串,s 和 t。...