貪心演算法刷題

2021-10-04 02:19:33 字數 1616 閱讀 9659

牛牛有乙個陣列array,牛牛可以每次選擇乙個連續的區間,讓區間的數都加1,他想知道把這個陣列變為嚴格單調遞增,最少需要操作多少次?

嚴格遞增,我們應該讓某個數字後面的乙個比他小的連續區間都進行加1操作,然後遍歷整個陣列(除最後乙個數字)。其實我們不需要真正的對陣列進行加1操作,只需要求出ai與ai+1的差,再加上1,就是需要加1的次數,不需要真正進行加1,因為如果ai+n比a[i]大,那這個加1操作與a[i+n]無關,如果比a[i]小,則也會相應加1,與a[i+1]的差並不會改變,當a[i+1]被當作前面的數時,求的依然是兩者的差值,故不進行加1操作也不會影響最後的次數。

class

solution

:def

increasingarray

(self , array)

: cnt=

0for i in

range

(len

(array)-1

):cnt+=

max(

0,array[i]

-array[i+1]

+1)return cnt

跟上面的那道題類似,也是對列表進行操作,但實際上又不用真正的去操作。依然使用貪心的"想當然"策略。想要最長連續相同字串,又最多改變k個字元,那我們就在字串裡找,這個字串中有k個字元與剩下的字元不同,這都是我們可以容忍的,記錄下在能容忍的情況下,字串的最長大小就是最後的結果。

主要是用什麼方法來記錄乙個字串,我嘗試的是two points的方法,設定左右兩個游標來限定為乙個字串。該問題還有乙個點就是怎麼計算是否超過限定的k,我剛開始使用.count()的方法,超時了。後面參考別人的**,應該使用變數來記錄下這個子串中的某個字元的數量,這樣就沒有必要每次去再遍歷子串了。

那我們需要a2c,c2a進行兩次,然後求最大值嘛?這個是不需要的,題目中只要求返回長度,那我們在記錄數量時,a和c的數量都記錄下來,然後當兩個都不能容忍k時,再讓左端游標移動,這個有點與非的意思。

class

solution

:def

solve

(self , k , s )

: right,left=0,

0 max_len=

0 s_length=

len(s)

a_cnt,c_cnt=0,

0while rightif(s[right]

=='a'

):a_cnt+=1if

(s[right]

=='c'

):c_cnt+=

1 right+=

1while

(a_cnt>k and c_cnt>k):if

(s[left]

=='a'

):a_cnt-=1if

(s[left]

=='c'

):c_cnt-=

1 left+=

1 max_len=

max(right-left,max_len)

return max_len

貪心演算法刷題ing

有 n 位使用者參加活動,他們的 id 從 0 到 n 1,每位使用者都 恰好 屬於某一使用者組。給你乙個長度為 n 的陣列 groupsizes,其中包含每位使用者所處的使用者組的大小,請你返回使用者分組情況 存在的使用者組以及每個組中使用者的 id 你可以任何順序返回解決方案,id 的順序也不受...

LeetCode刷題指南 貪心演算法

45.跳躍遊戲 ii class solution maxl nextmax return 0 134.加油站 第一種解法 比較容易理解,但是效率比較低 class solution return rest 0 1 start 621.任務排程器 給定乙個用字元陣列表示的 cpu 需要執行的任務列表...

Leetcode刷題系列(六)貪心演算法

在某乙個標準下,優先考慮最滿足標準的樣本,最後考慮最不滿足標準的樣本,最終得到乙個答案的演算法,叫作貪心演算法。也就是說,不從整體最優上加以考慮,所做出的是在某種意義上的區域性最優解。如何從區域性最優達到全域性最優解?舉反例和對數器來進行證明。對於給定的糖果和孩子胃口,看能最多滿足多少孩子。解題思路...