算法笔记|Day25贪心算法III

算法笔记|Day25贪心算法III

  • [☆☆☆☆☆leetcode 134. 加油站](#☆☆☆☆☆leetcode 134. 加油站)
  • [☆☆☆☆☆leetcode 135. 分发糖果](#☆☆☆☆☆leetcode 135. 分发糖果)
  • [☆☆☆☆☆leetcode 860.柠檬水找零](#☆☆☆☆☆leetcode 860.柠檬水找零)
  • [☆☆☆☆☆leetcode 406.根据身高重建队列](#☆☆☆☆☆leetcode 406.根据身高重建队列)

☆☆☆☆☆leetcode 134. 加油站

题目链接:leetcode 134. 加油站

题目分析

用cur表示走到i时剩余油量,sum表示总的剩余油量,start表示开始出发时的位置(默认为0)。若cur出现小于0的情况,说明无法到达,则从下一个位置重新开始(即把i+1赋值给start)并恢复剩余油量cur为0;若结束总sum小于0,说明无法走一圈返回-1;否则返回开始位置start。

代码

java 复制代码
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int cur=0,sum=0,start=0;
        for(int i=0;i<gas.length;i++){
            cur+=gas[i]-cost[i];
            sum+=gas[i]-cost[i];
            if(cur<0){
                cur=0;
                start=i+1;
            }
        }
        if(sum<0)
            return -1;
        return start;
    }
}

☆☆☆☆☆leetcode 135. 分发糖果

题目链接:leetcode 135. 分发糖果

题目分析

此题需要考虑从左到右和从右到左两个方向,应分别考虑。首先每个孩子分发一个糖果(依次遍历candies数组并赋值为1),从左到右遍历,若比前一个孩子的分数高,则在前一个孩子得到糖果的基础上加一;再从右到左考虑,若需要在后一个孩子得到糖果的基础上加一,同时还要满足第一种情况,需要取两者最大值(也就是和第一种情况分发后的糖果数相比取最大值);最后遍历糖果数求和即可。

代码

java 复制代码
class Solution {
    public int candy(int[] ratings) {
        int candies[]=new int[ratings.length];
        for(int i=0;i<candies.length;i++)
            candies[i]=1;
        for(int i=1;i<ratings.length;i++){
            if(ratings[i]>ratings[i-1])
                candies[i]=candies[i-1]+1;
        }
        for(int i=ratings.length-2;i>=0;i--){
            if(ratings[i+1]<ratings[i])
                candies[i]=Math.max(candies[i+1]+1,candies[i]);
        }
        int res=0;
        for(int candy:candies)
            res+=candy;
        return res;
    }
}

☆☆☆☆☆leetcode 860.柠檬水找零

题目链接:leetcode 860.柠檬水找零

题目分析

依次遍历bills数组中的值,有三种情况:①收入5元,five加一,不会出现false情况;②收入10元,若有5元则five减一且ten加一,否则返回false;③收入20元,若有至少一张5元且有至少一张10元则five减一ten减一,若没有上述情况但有至少三张5元则five减三,否则返回false。若遍历结束,仍无false情况则返回true。

代码

java 复制代码
class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five=0,ten=0;
        for(int bill:bills){
            if(bill==5)
                five++;
            if(bill==10){
                if(five==0)
                    return false;
                five--;
                ten++;
            }
            if(bill==20){
                if(five>0&&ten>0){
                    five--;
                    ten--;
                }else if(five>=3){
                    five-=3;
                }else
                    return false;
            }
        }
        return true;
    }
}

☆☆☆☆☆leetcode 406.根据身高重建队列

题目链接:leetcode 406.根据身高重建队列

题目分析

首先将people数组排序,按高度h降序排列,若高度h相同,按照前面有k个身高大于或等于h人中的k升序排列,这样只需要从高到低依次按索引k插入新的链表即可。

代码

java 复制代码
class Solution {
    public int[][] reconstructQueue(int[][] people) {
        List<int[]> resList=new LinkedList<>();
        Arrays.sort(people,(a,b)->{
            if(a[0]==b[0]) return a[1]-b[1];
            return b[0]-a[0];
        });
        for(int p[]:people){
            resList.add(p[1],p);
        }
        return resList.toArray(new int[people.length][]);
    }
}

提示:
Arrays.sort(people,(a,b)->{
if(a0==b0) return a1-b1;
return b0-a0;
为Lambda表达式(也称为Lambda函数或Lambda方法)是一种简洁地表示匿名方法的方式。Lambda表达式主要用于实现只有一个抽象方法的接口(这样的接口被称为函数式接口)。

相关推荐
叩码以求索16 分钟前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
谙弆悕博士1 小时前
信息系统项目管理师教程(第4版)笔记——第 2 章 信息技术发展
笔记·职场和发展·软考高级·软考·高项·项目经理
c238562 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
wp123_12 小时前
【硬件选型笔记】TONEVEE MVL4020-1R2M 与Coilcraft XAL4020-122MEC 大电流功率电感参数深度解析
笔记
aaaameliaaa3 小时前
指针之总结
c语言·笔记·算法
宵时待雨3 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz3 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2163 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
撩得Android一次心动3 小时前
Linux编程笔记3【个人用】
linux·笔记
noipp3 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu