分发糖果 LeetCode 135
题目链接:[LeetCode 135 - 困难]
思路
主要是使用两个for循环来解决,使用两次贪心的策略。
贪心:
class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
int[] candyVec = new int[len];
candyVec[0]=1;
for(int i=1;i<len;i++){
candyVec[i]=(ratings[i]>ratings[i-1])?candyVec[i-1]+1:1;
}
for(int i=len-2;i>=0;i--){
if(ratings[i]>ratings[i+1])
candyVec[i]=Math.max(candyVec[i],candyVec[i+1]+1);
}
int result=0;
for(int num:candyVec){
result+=num;
}
return result;
}
}
根据身高重建队列 LeetCode 406
题目链接:[LeetCode 406 - 中等]
思路
主要解决的是如何排序: 例子:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
排序后:[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]
que.add(p[1],p);
结果:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
贪心:
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,(a,b)->{
if(a[0]==b[0])return a[1]-b[1];
return b[0]-a[0];
});
LinkedList<int[]> que = new LinkedList<>();
for(int[] p:people){
que.add(p[1],p);
}
return que.toArray(new int[people.length][]);
}
}
跳跃游戏 LeetCode 55
题目链接:[LeetCode 55 - 中等]
思路
贪心中的区间问题
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点
贪心:
class Solution {
public boolean canJump(int[] nums) {
if(nums.length==1)return true;
int coverRange=0;
for(int i=0;i<=coverRange;i++){
coverRange = Math.max(coverRange,nums[i]+i);
if(coverRange>=nums.length-1){
return true;
}
}
return false;
}
}
跳跃游戏 II LeetCode 45
题目链接:[LeetCode 45 - 中等]
思路
贪心的区间问题,相较于55,该题是必须会到,但是求最小的跳跃次数。
贪心:
class Solution {
public int jump(int[] nums) {
if(nums==null||nums.length==0|nums.length==1)return 0;
int maxRange=0;
int curRange=0;
int result=0;
for(int i=0;i<nums.length;i++){
maxRange=Math.max(maxRange,nums[i]+i);
if(maxRange>=nums.length-1){
result++;
break;
}
if(i==curRange){
curRange=maxRange;
result++;
}
}
return result;
}
}