Leetcode刷題記錄 簡單難度 貪心演算法

2021-10-06 20:30:55 字數 3864 閱讀 6676

二、與貪心演算法相關的題目

2.分發餅乾

3.模擬行走機械人

總結所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解。

選擇的貪心策略必須具備無後效性(即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。)

在乙個「平衡字串」中,『l』 和 『r』 字元的數量是相同的。

給出乙個平衡字串 s,請你將它分割成盡可能多的平衡字串。

返回可以通過分割得到的平衡字串的最大數量。

示例1

輸入:s = 「rlrrllrlrl」

輸出:4

解釋:s 可以分割為 「rl」, 「rrll」, 「rl」, 「rl」, 每個子字串中都包含相同數量的 『l』 和 『r』。

示例2

輸入:s = 「llllrrrr」

輸出:1

解釋:s 只能保持原樣 「llllrrrr」.

class

solution

:def

balancedstringsplit

(self, s:

str)

->

int:

num =

0 result =

0for c in s:

if c ==

"r":

num +=

1else

: num -=1if

not num:

result +=

1return result

假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。對每個孩子 i ,都有乙個胃口值 gi ,這是能讓孩子們滿足胃口的餅乾的最小尺寸;並且每塊餅乾 j ,都有乙個尺寸 sj 。如果 sj >= gi ,我們可以將這個餅乾 j 分配給孩子 i ,這個孩子會得到滿足。你的目標是盡可能滿足越多數量的孩子,並輸出這個最大數值。

注意:

你可以假設胃口值為正。

乙個小朋友最多只能擁有一塊餅乾。

示例1

輸入: [1,2,3], [1,1]

輸出: 1

解釋:你有三個孩子和兩塊小餅乾,3個孩子的胃口值分別是:1,2,3。

雖然你有兩塊小餅乾,由於他們的尺寸都是1,你只能讓胃口值是1的孩子滿足。

所以你應該輸出1。

如果當前餅乾滿足胃口,則處理下乙個餅乾和孩子。貪婪體現在每次只關注乙個小孩的胃口。

class

solution

:def

findcontentchildren

(self, g: list[

int]

, s: list[

int])-

>

int:

g.sort(reverse =

false

) s.sort(reverse =

false

) kid =

0 cookie =

0 result =

0while kid <

len(g)

and cookie <

len(s)

:if s[cookie]

>= g[kid]

: kid +=

1 cookie +=

1 result +=

1elif s[cookie]

< g[kid]

: cookie +=

1return result

機械人在乙個無限大小的網格上行走,從點 (0, 0) 處開始出發,面向北方。該機械人可以接收以下三種型別的命令:

在網格上有一些格仔被視為障礙物。

第 i 個障礙物位於網格點 (obstacles[i][0], obstacles[i][1])

機械人無法走到障礙物上,它將會停留在障礙物的前乙個網格方塊上,但仍然可以繼續該路線的其餘部分。

返回從原點到機械人所有經過的路徑點(座標為整數)的最大歐式距離的平方。

示例1

輸入: commands = [4,-1,3], obstacles =

輸出: 25

解釋: 機械人將會到達 (3, 4)

示例2

輸入: commands = [4,-1,4,-2,4], obstacles = [[2,4]]

輸出: 65

解釋: 機械人在左轉走到(1, 8) 之前將被困在 (1, 4) 處

分析:

1.不同的方向,向左和向右是不一樣的,比如方向向左,這個方向左方向是向下的,所以相應的y座標應減少。可以用字典的方法儲存不同方向所做出的不同行動。

2.障礙物題目中給出是列表的形式,若使用題目中的形式會超時,這時應該將障礙物轉化為集合的形式

3.一定要假設走一步,看是否遇到障礙物,因為若遇到障礙物會停留在障礙物的前一步。遇到障礙物則break跳出迴圈

class

solution

:def

robotsim

(self, commands: list[

int]

, obstacles: list[list[

int]])

->

int:

dirction =

,"down":,

"left":,

"right":}

curdir =

"up"

cord =[0

,0] res =

0 obstacles =

set(

map(

tuple

, obstacles)

)for cd in commands:

if cd <0:

curdir = dirction[curdir]

[cd]

else

:for i in

range(1

,cd+1)

: tempx = cord[0]

+ dirction[curdir][0

][0]

tempy = cord[1]

+ dirction[curdir][0

][1]

if(tempx, tempy)

in obstacles:

break

else

: cord =

[tempx, tempy]

res =

max(res, cord[0]

**2+cord[1]

**2)return res

感覺上面的3個題目只能體會出少許貪心演算法的思想,他們都是涉及將大問題化成小問題,著重於區域性忽略整體。感覺其他在網上看到的常見貪心演算法的題目會更好地體現貪心如揹包問題。

能使用貪心演算法的前提:

leetcode刷題記錄 1 簡單

題目 給定乙個二叉樹,返回所有從根節點到葉子節點的路徑。說明 葉子節點是指沒有子節點的節點。param root return var binarytreepaths function root const res if root.left root.right binarytreepathsdee...

leetcode刷題記錄 7 簡單

題目 給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。思路 可以遍歷從下標0到長度的一半,如果當前的長度除總長度的餘數為0,說明長度可以整除。然後重複這個字串到總長度,和原字串相比,如果相等,則滿足條件。如果到l 2還沒找到相等的...

leetcode刷題記錄 9 簡單

題目 給出 n 名運動員的成績,找出他們的相對名次並授予前三名對應的獎牌。前三名運動員將會被分別授予 金牌 銀牌 和 銅牌 gold medal silver medal bronze medal 注 分數越高的選手,排名越靠前。思路 拷貝乙份陣列,先排序,然後對數字前三個賦值字串,後面賦值對應的下...