LeetCode貪心演算法題解

2022-09-14 03:36:09 字數 2997 閱讀 1341

leetcode 860. 檸檬水找零

題幹:在檸檬水攤上,每一杯檸檬水的售價為 5 美元。顧客排隊購買你的產品,(按賬單 bills 支付的順序)一次購買一杯。

每位顧客只買一杯檸檬水,然後向你付 5 美元、10 美元或 20 美元。你必須給每個顧客正確找零,也就是說淨交易是每位顧客向你支付 5 美元。

注意,一開始你手頭沒有任何零錢。

給你乙個整數陣列 bills ,其中 bills[i] 是第 i 位顧客付的賬。如果你能給每位顧客正確找零,返回 true ,否則返回 false 。

分析:1、20面值的鈔票到手後不可能找給客戶,可以不用統計

2、找零時優先用10美元的鈔票,沒有時才用5美元的。

**:

1

class

solution else

14 }else

20while(fives &&t)

24if(t) return

false

; //最後若還沒完成找零,返回false25}

26}27return

true

; //遍歷完陣列返回true;28}

29 };

leetcode

392. 判斷子串行

題幹:給定字串 s 和 t ,判斷 s 是否為 t 的子串行。

字串的乙個子串行是原始字串刪除一些(也可以不刪除)字元而不改變剩餘字元相對位置形成的新字串。(例如,"ace"是"abcde"的乙個子串行,而"aec"不是)。

分析:用兩個指標分別遍歷兩個字串,對於s的每乙個字元,用t中的字元對比,若相同兩個指標一起前移,否則指向t的指標前移。

**:

class solution

return k ==s.size();          //若最後走到了s的終點,說明存在子串,返回ture,否則返回false

}}

leetcode455. 分發餅乾

題幹:假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。

對每個孩子 i,都有乙個胃口值 g[i],這是能讓孩子們滿足胃口的餅乾的最小尺寸;並且每塊餅乾 j,都有乙個尺寸 s[j] 。如果 s[j] >= g[i],我們可以將這個餅乾 j 分配給孩子 i ,這個孩子會得到滿足。你的目標是盡可能滿足越多數量的孩子,並輸出這個最大數值。

分析:1、家長分餅乾時優先把較小的餅乾分出去

2、盡量先滿足胃口較小的孩子的要求

**:

class

solution

}return

res;    //遍歷完餅乾陣列後返回最後的res值

}};

leetcode55. 跳躍遊戲

給定乙個非負整數陣列nums,你最初位於陣列的 第乙個下標 。

陣列中的每個元素代表你在該位置可以跳躍的最大長度。

判斷你是否能夠到達最後乙個下標。

示例 1:

輸入:nums = [2,3,1,1,4]

輸出:true

解釋:可以先跳 1 步,從下標 0 到達下標 1, 然後再從下標 1 跳 3 步到達最後乙個下標。

分析:從初始位置開始,遍歷當前能跳到的位置,看看能不能跳到更遠的位置。

class

solution

return res >= (int)nums.size() - 1

; //res是下標值,故-1

}};

leetcode45. 跳躍遊戲 ii

給你乙個非負整數陣列 nums ,你最初位於陣列的第乙個位置。

陣列中的每個元素代表你在該位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。

假設你總是可以到達陣列的最後乙個位置。

示例 1:

輸入: nums = [2,3,1,1,4]

輸出: 2

解釋: 跳到最後乙個位置的最小跳躍數是 2。

從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步到達陣列的最後乙個位置。

分析:假設f(i)為跳到第i個格仔所需步數,則易知f是形如[11122223334444]的遞增陣列,越往後跳需要的步數一定是增加的,並且不會產生跳步

所以,只要知道最後乙個元素落在哪個區間即可。則可以用廣度優先搜尋的辦法,按層遍歷同時找到下一層的範圍。

class

solution

l = r + 1

; r =max_r;    //更新l和r;

step ++;

if(r >= nums.size()-1) break

;  //當r能夠覆蓋最後乙個元素時,退出迴圈

}return

step;  //返回此時的step

}};

leetcode376. 擺動序列

題幹:如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為 擺動序列 。第乙個差(如果存在的話)可能是正數或負數。僅有乙個元素或者含兩個不等元素的序列也視作擺動序列。

例如, [1, 7, 4, 9, 2, 5] 是乙個 擺動序列 ,因為差值 (6, -3, 5, -7, 3) 是正負交替出現的。

相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是擺動序列,第乙個序列是因為它的前兩個差值都是正數,第二個序列是因為它的最後乙個差值為零。

子串行 可以通過從原始序列中刪除一些(也可以不刪除)元素來獲得,剩下的元素保持其原始順序。

給你乙個整數陣列 nums ,返回 nums 中作為 擺動序列 的 最長子序列的長度 。

分析:先把陣列相鄰重複元素刪除,因為這些元素不會影響到最終結果。

再遍歷陣列,如果滿足,小大小 或 大小大 其中之一,則最終答案+1;

**:

class

solution

return

res;

}};

leetcode題解 貪心演算法

貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。通常貪心演算法的 會非常短而且思路也非常的簡單,但貪心演算法真正的難點在於確定我們當前的問題確實可以使用貪心演算法。這是一道簡單的貪心演算法問題...

貪心演算法(leetcode)

1 分糖果 455 用最小的糖果大小滿足需求最小的孩子 class solution else return count 2 搖擺序列 376 遍歷一次,儲存乙個狀態,如果狀態為上公升,變為下降,則長度 1,下降變上公升 1 class solution def wigglemaxlength se...

LeetCode 貪心演算法

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