貪心演算法(leetcode)

2021-09-07 14:09:31 字數 3325 閱讀 7113

1 分糖果 455

用最小的糖果大小滿足需求最小的孩子

class solution else

}return count;}};

2 搖擺序列  376

遍歷一次,儲存乙個狀態,如果狀態為上公升,變為下降,則長度+1,下降變上公升+1

class solution:

def wigglemaxlength(self, nums):

""":type nums: list[int]

:rtype: int

"""if len(nums) < 2:

return len(nums)

up = 1

begin = 0

down = 2

length = 1

state = begin;

for i in range(1, len(nums)):

if state == begin:

if nums[i] > nums[i-1]:

state = up

length += 1

elif nums[i] < nums[i-1]:

state = down

length += 1

else:

state = begin

elif state == up:

if nums[i] >= nums[i-1]:

state = up

elif nums[i] < nums[i-1]:

state = down

length += 1

elif state == down:

if nums[i] > nums[i-1]:

state = up

length += 1

else:

state = down

return length

3 移除k個數字 402

問題:求移除k個數字後能夠獲得的最小的可能的新數字

思路:例如 1432219  從高位開始遍歷 如果高位值比低位值大的話說明需要去掉 

遍歷字串,用乙個棧來儲存需要保留的元素,如果棧頂元素》新元素  需要pop   還有2個特殊情況,如果棧為空,且新元素為0則不要他了,第二個如果 遍歷完k仍然大於0  比如12345  則把後面的元素去掉就行了

class solution:

def removekdigits(self, num, k):

""":type num: str

:type k: int

:rtype: str

"""stack =

for i in range(len(num)):

while stack and int(stack[-1]) > int(num[i]) and k > 0:

stack.pop()

k -= 1

if num[i] != '0' or len(stack)!= 0:

while k > 0 and stack:

stack.pop()

k -= 1

return ''.join(stack) if stack else '0'

4 跳躍遊戲 55

題目:乙個陣列a中每乙個元素儲存了可以從當前位置向後跳a[i] 步  ,能否從0跳到最後

max_index為能到達的最遠位置,jump為當前所處位置,如果jump& nums)

int cur_max_index = nums[0];//當前可達到的最遠位置

int every_max_index = nums[0]; //遍歷各個位置過程中,能達到的最遠位置

int jump = 1;

for(int i = 0;icur_max_index)

if(every_max_index6 射擊氣球 452

題目:給定x軸上,給定幾個氣球位置, 最少需要幾個弓箭手把氣球射爆

思路:把座標按左值進行排序,維護乙個射擊區間,遍歷過程中,如果有交集則 更新射擊區間,不行就加弓箭手

bool cmp(const pair&a, const pair&b)

class solution

sort(points.begin(), points.end(), cmp);

int shot_begin = points[0].first;

int shot_end = points[0].second;

int shooter = 1;

for(int i =1; i< points.size();i++)

}else

}return shooter;}};

7 最低加油次數  871

思路:把target加入到加油站中,遍歷加油站,每次判斷能不能到達下乙個加油站,一直維持加油陣列,如果不能到達下乙個加油站,就選擇其中乙個最多油的地方加油

class solution:

def minrefuelstops(self, target, startfuel, stations):

""":type target: int

:type startfuel: int

:type stations: list[list[int]]

:rtype: int

"""if len(stations) == 0:

return 0 if startfuel >= target else -1

pre_station = 0

qiyou =

ret = 0

cur_qiyou = startfuel

for i in range(len(stations)):

dis = stations[i][0] - pre_station

while(qiyou and cur_qiyou < dis):

cur_qiyou += max(qiyou)

qiyou.remove(max(qiyou))

ret += 1

if(len(qiyou) == 0 and cur_qiyou < dis):

return -1

cur_qiyou -= dis

pre_station = stations[i][0]

return ret

LeetCode 貪心演算法

12.15 135.12.21 435.假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。對每個孩子 i,都有乙個胃口值 g i 這是能讓孩子們滿足胃口的餅乾的最小尺寸 並且每塊餅乾 j,都有乙個尺寸 s j 如果 s j g i 我們可以將這個餅乾 j 分配給孩...

leetcode 貪心演算法

貪心演算法中,是以自頂向下的方式使用最優子結構,貪心演算法會先做選擇,在當時看起來是最優的選擇,然後再求解乙個結果的子問題。貪心演算法是使所做的選擇看起來都是當前最佳的,期望通過所做的區域性最優選擇來產生乙個全域性最優解 如最小生成樹 dijkstra單源最短路徑 貪心選擇性質 所謂貪心選擇性質是指...

LeetCode 貪心演算法

保證每次操作都是區域性最優的,並且最後得到的結果是全域性最優的。455.分發餅乾 題目描述 每個孩子都有乙個滿足度,每個餅乾都有乙個大小,只有餅乾的大小大於等於乙個孩子的滿足度,該孩子才會獲得滿足。求解最多可以獲得滿足的孩子數量。示例 輸入 1,2,3 1,1 輸出 1 解釋 你有三個孩子和兩塊小餅...