Java入门算法(贪心篇)丨蓄力计划
本專欄已參加蓄力計劃,感謝讀者支持
往期文章
一. Java入門算法(貪心篇)丨蓄力計劃
二. Java入門算法(暴力篇)丨蓄力計劃
三. Java入門算法(排序篇)丨蓄力計劃
四. Java入門算法(遞歸篇)丨蓄力計劃
五. Java入門算法(雙指針篇)丨蓄力計劃
六. Java入門算法(數據結構篇)丨蓄力計劃
七. Java入門算法(滑動窗口篇)丨蓄力計劃
你好,我是Ayingzz,Ayi是我的名字,ing進行時代表我很有動力,zz提醒我按時睡覺 ~
- 篇幅短小精悍,適合初學者反復咀嚼:此專欄的文章并不是一系列大而全的整理文章,而是一系列簡明扼要的算法入門講解文章,篇幅短而內容精,有利于初學者針對一種或多種算法快速入門。
- 例題簡單易懂,讓你印象深刻:引入精選LeetCode簡易算法例題,通過生動形象的講解對其思路進行簡明剖析,更容易上手并掌握。
- 涉及算法種類廣:雙指針、遞歸、排序、貪心、分治、動態規劃、滑動窗口、DFS...各類基礎算法收攬其中。
為什么要學算法?
對于所有的Problems-Solving的過程都可以理解為算法,程序員對算法或多或少都有著一些復雜的情感,為什么一定要學算法?
- "程序 = 數據結構 + 算法"。這個公式相信已經耳濡目染,目前在各大廠的面試里,對基礎算法的考察的比重逐年增加,只寫會某種語言的工程代碼顯然并不太夠,大部分面試官會優先考慮掌握算法的面試者。在現實開發里,僅使用一些簡單的算法就可以快讀優化各種繁雜的工程代碼,降低時間復雜度與工程運行速度,提升用戶體驗。
- 對算法的熱愛。作為程序員或多或少對算法都有著某種情感上的執著與偏愛,如果你還是學生,想參與各類的競賽,那么入門算法即是數學建模、軟件開發、算法等各類競賽的敲門磚,選手的動力就是對算法的追求與熱愛,類似的有ACM、藍橋杯等。
專欄思路和內容大綱
基礎部分:
進階部分:
適宜人群
- 對算法感興趣的初學者
- 想加強算法基本功的讀者
貪心篇
- 往期文章
- 為什么要學算法?
- 專欄思路和內容大綱
- 適宜人群
- ~
- 前言
- (本篇內容)
- 花朵 Flower
- 糖果 Candy
- 餅干 Cookie
- 股票 Stock
- (推薦練習)
- 加油站
- 跳躍游戲
~
前言
貪心算法是入門算法之一,它在百度百科上是這樣解釋的。
貪心算法的使用條件有兩個:
一個問題的整體最優解可以通過一系列局部最優解的選擇達到,并且每次的選擇可以依賴以前作出的選擇,但不依賴于后面要作出的選擇,這就是貪心選擇性質。
當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。問題的最優子結構性質是該問題可用貪心法求解的關鍵所在。在實際應用中,至于什么問題具有什么樣的貪心選擇性質是不確定的,需要具體問題具體分析。
(本篇內容)
花朵 Flower
LeetCode題目描述:605.種花問題(Easy)示例
輸入:flowerbed = [1,0,0,0,1], n = 1 輸出:true ------------------------------------ 輸入:flowerbed = [1,0,0,0,1], n = 2 輸出:false思路:
貪心策略的使用:
class Solution {public boolean canPlaceFlowers(int[] flowerbed, int n) {int L = flowerbed.length;for (int i = 0; i < L; i += 2) {if (flowerbed[i] == 0) {if (i == L - 1 || flowerbed[i + 1] == 0) {n--;}else{i++;}}}return n <= 0;} }糖果 Candy
LeetCode題目描述:135. 分發糖果(Hard)
老師想給孩子們分發糖果,有 N 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。
你需要按照以下要求,幫助老師給這些孩子分發糖果:示例
輸入:[1,0,2] 輸出:5 解釋:你可以分別給這三個孩子分發 2、1、2 顆糖果。 ----------------------------------------------------- 輸入:[1,2,2] 輸出:4 解釋:你可以分別給這三個孩子分發 1、2、1 顆糖果。第三個孩子只得到 1 顆糖果,這已滿足上述兩個條件。思路:
貪心策略的使用:
class Solution {public static int candy(int[] ratings) {int[] candy = new int[ratings.length];// 每個孩子至少有一個糖果,初始化數組元素為1Arrays.fill(candy, 1);// 從左往右,每次考慮左邊孩子評分比右邊孩子評分高的情況for (int i = 0; i < ratings.length - 1; ++i) {if (ratings[i + 1] > ratings[i]) {candy[i + 1] = candy[i] + 1;}}// 從右往左,每次考慮右邊孩子評分比左邊孩子評分高的情況for (int i = ratings.length - 1; i > 0; --i) {if (ratings[i - 1] > ratings[i] && candy[i - 1] <= candy[i]) {candy[i - 1] = candy[i] + 1;} }// 答案數組求和int min_candy_sum = 0;for (int x : candy) { min_candy_sum += x;}return min_candy_sum;} }餅干 Cookie
LeetCode題目描述:455. 分發餅干(Easy)示例
輸入: g = [1,2,3], s = [1,1] 輸出: 1 解釋: 你有三個孩子和兩塊小餅干,3個孩子的胃口值分別是:1,2,3。 雖然你有兩塊小餅干,由于他們的尺寸都是1,你只能讓胃口值是1的孩子滿足。 所以你應該輸出1。 --------------------------------------------------------------------- 輸入: g = [1,2], s = [1,2,3] 輸出: 2 解釋: 你有兩個孩子和三塊小餅干,2個孩子的胃口值分別是1,2。 你擁有的餅干數量和尺寸都足以讓所有孩子滿足。 所以你應該輸出2.思路:
股票 Stock
LeetCode題目描述:122. 買賣股票的最佳時機 ll(Easy)*注:你必須在再次購買前出售掉之前的股票。
示例
輸入: [7,1,5,3,6,4] 輸出: 7解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 -1 = 4 。隨后,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6 -3 = 3 。
輸入: [1,2,3,4,5] 輸出: 4解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
思路:
貪心策略的使用:
class Solution {public int maxProfit(int[] prices) {int ans = 0;int n = prices.length;if (n == 1) {return 0;}for (int i = 0; i < n - 1; ++i) {// 尋找極小值while (i < n - 1 && prices[i] > prices[i + 1]) {++i;}// 買入ans -= prices[i];// 尋找極大值while (i < n - 1 && prices[i] < prices[i + 1]) {++i;}// 賣出ans += prices[i];}return ans;} }(推薦練習)
\
加油站
- 在一條環路上有 N 個加油站,其中第 i 個加油站有汽油 gas[i] 升。
- 你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i+1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發,開始時油箱為空。
- 如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 -1。
跳躍游戲
- 給定一個非負整數數組 nums ,你最初位于數組的 第一個下標 。
- 數組中的每個元素代表你在該位置可以跳躍的最大長度。
- 判斷你是否能夠到達最后一個下標。
/
總的來說,具體問題具體分析,只要確定一個問題的局部最優解可以導致問題的整體最優解,那么即可以考慮選擇貪心策略、分治或動態規劃(下篇)解決。
若有不當歡迎指正。本專欄持續周更,預計7月結束
總結
以上是生活随笔為你收集整理的Java入门算法(贪心篇)丨蓄力计划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 方舟武器品质怎么提升(方舟生存进化)
- 下一篇: java美元兑换,(Java实现) 美元