【LeetCode】135.分發糖果
阿新 • • 發佈:2020-12-24
題目連結
135. 分發糖果
題目描述
解題思路
貪心法
兩次貪心:從左到右進行貪心選擇,從右到左進行貪心選擇
題目中說到:相鄰的孩子中,評分高的孩子必須獲得更多的糖果。這裡的相鄰包含兩種情況:左相鄰和右相鄰,我們不能一次性把左相鄰和右相鄰通通考慮,這樣只會得不償失,我們採取的策略是分兩次考慮,所以可以把總的規則分為左相鄰規則和右相鄰規則,只要同時滿足左相鄰規則和右相鄰規則,那就滿足了題目要求。
初始所有孩子的糖果數都為1. 左相鄰規則:從左到右遍歷,if(rate[i] > rate[i-1]),索引為i的孩子的糖果數目比索引為i-1的孩子的糖果數+1,並用left陣列記錄 右相鄰規則:從右到左遍歷,if(rate[i] > rate[i+1]),索引為i的孩子的糖果數目比索引為i+1的孩子的糖果數+1,並用right陣列記錄 如何既滿足左相鄰又滿足右相鄰規則呢? 最終索引為i的孩子擁有的糖果數目=Math.max(left[i],righy[i])
AC程式碼
class Solution { public int candy(int[] ratings) { int left[] = new int[ratings.length]; int right[] = new int[ratings.length]; Arrays.fill(left,1); Arrays.fill(right,1); int ans = 0; for(int i = 1; i < ratings.length; i++){ if(ratings[i] > ratings[i-1]) left[i] = left[i-1] + 1; } for(int i = ratings.length-2; i >= 0; i--){ if(ratings[i] > ratings[i+1]) right[i] = right[i+1] + 1; } for(int i = 0; i < ratings.length; i++){ ans += Math.max(left[i],right[i]); } return ans; } }