今天,書店老闆有一家店打算試營業思路: 總和分成前後兩部分a和b。a部分是從0到位置i的掃瞄和。b部分是從位置i+1的字尾和。求a+b的最大和即可。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
先求字尾和 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。...