首页 > 其他分享 >代码随想录贪心专题-day1

代码随想录贪心专题-day1

时间:2023-07-21 22:45:39浏览次数:39  
标签:return int 孩子 随想录 找零 day1 candies five 贪心

35. 分发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

思路:

本题这种要同时满足左右两种情况的题目,我们一般不直接处理左右两边,而是前处理一边,再处理另一边。回到本题来,我们可以先从前到后枚举右孩子大于左孩子的情况,再从后往前枚举左孩子大于右孩子的情况,注意计算左孩子大于右孩子的情况的时候,还需要满足情况1,所以我们取两次的最大值。

代码:

class Solution {
    // 2023-7-21
    // 二刷 这种要考虑两边的题目,一般来说先确定一边
    // 再确定另一边
    // 两次遍历 
    // 一次遍历右孩子大于左孩子 从前往后
    // 一次左孩子大于右孩子 必须从后往前,才能利用上一次的结果
    public int candy(int[] ratings) {
        int n = ratings.length;
        int[] candies = new int[n];
        Arrays.fill(candies, 1);

        // 从前往后 右孩子 > 左孩子
        for (int i = 1; i < n; i ++ ) {
            if (ratings[i] > ratings[i - 1]) {
                candies[i] = candies[i - 1] + 1;
            }
        }

        // 从后往前 左孩子 > 右孩子
        for (int i = n - 2; i >= 0; i --) {
            if (ratings[i]  > ratings[i + 1]) {
                candies[i] = Math.max(candies[i], candies[i + 1] + 1);
            }
        }

        return Arrays.stream(candies).sum();
    }
}

860. 柠檬水找零

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

思路:

本题贪心的点在于面对20的时候我们该如何找零,我们可以找零的方式无非就是两种:1.找10+5;2.找5+5+5。显然我们认为5元更有用,因为他还能找10元滴,所以我们优先用方式1找零。

代码:

class Solution {
    // 2023-7-21
    // 代码随想录 二刷
    // 每杯柠檬水 5 美元
    public boolean lemonadeChange(int[] bills) {
        int five = 0, ten = 0; // 因为最大的面值为20,所以20元的钞票不在找零的范围内

        for (int bill : bills) {
            if (bill == 5) five ++;
            else if (bill == 10) {
                if (five == 0) return false; // 没有5美元的
                five --;
                ten ++;
            } else if (bill == 20){ // 优先用10 + 5 找钱,因为5比较万能
                if (five != 0 && ten != 0) {
                    five --;
                    ten --;
                } else if (five >= 3){
                    five -=3;
                } else return false;
            }
        }

        return true;
    }
}

406.根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

思路

本题类似135,同样需要安装两个规则来排序,我们分析后可知,如果先按k排序,并不能满足。所以我们先安装h排序,将身高高的放前面,再遍历将元素插入到对应的k位置上即可。

代码

class Solution {
    // 复习2023-4-20
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, (a, b) -> {
            if (a[0] == b[0]) return a[1] - b[1]; // 身高一样的比较k,k小的在前 a - b是升序
            return b[0] - a[0]; // 身高不一样的比较身高,高的在前 b - a是降序
        });

        LinkedList<int[]> que = new LinkedList<>();
        for (int[] p : people) {
            que.add(p[1], p); // 把p插入到p[1] 及k的位置上
        }

        return que.toArray(new int[people.length][]);
    }
}

标签:return,int,孩子,随想录,找零,day1,candies,five,贪心
From: https://www.cnblogs.com/ku-man/p/17572529.html

相关文章

  • Day1
    Markdown学习新建新建文件夹并修改名称文件夹内新建文本文档修改后缀名为.md(如无后缀:查看-文件扩展名)即可进入Typora编辑模式标题+空格:一级标题+空格:二级标题(以此类推,至多6个等级)字体加粗:helloworld(文段前后双**)斜体:helloworld(文段前后单*)删除线:helloworld(文段前后......
  • 《渗透测试》Day1 WEB攻防-前后台功能点&文件下载&文件读取&文件删除&目录遍历&目录穿
     #文件安全-下载&删除-黑白盒1、下载=读取常规下载URL:http://www.xiaodi8.com/upload/123.pdf可能存在安全URL:http://www.xiaodi8.com/xx.xx?file=123.pdf利用:常规下载敏感文件(数据库配置,中间件配置,系统密匙等文件信息)2、文件删除(常出现后台中)可能存在安全问题:前台或后台......
  • Markdown学习Day1
    Markdown学习二级标题三级标题四级标题五级标题 字体Hello,World!Hello,World!Hello,World!Hello,World! 引用选择狂神说java,走向人生巅峰 分割线 图片  超链接 点击跳转到狂神博客 列表ABC ABC 表格 名字......
  • 代码随想录训练营 Day01- 数组(上)
    概述第一天主要学习的是数组相关的内容,相关学习的内容包括数组的基本特性的学习,二分搜索方法的学习。数组特点数组的基本特点包括:下标从0开始内存连续性(Java中定义数组需要直接声明其空间大小)数组元素不可以删,只能覆盖ArrayList底层是数组实现,其实际上应该叫一......
  • 2023夏季集训D1-贪心二分
    2023夏季集训D1贪心二分0x00前言24OIFXJ大佬来给我们讲课OrzOrz.讲课好难TAT.0x10贪心0x11经典贪心写了BestCowLineG/S和田忌赛马一位小伙从同学那里要来了一份BestCow代码Debug但没有发现代码没有输入,这是他思路3小时后发生的hack.田忌赛马太......
  • day10
    OtterCTF2018一、[OtterCTF2018]Whatthepassword?1.使用volatility2获取内存镜像的版本信息python2vol.py-f'/home/cpyq/Desktop/OtterCTF.vmem'imageinfo2.使用mimikatz直接获得密码和用户信息python2vol.py-f'/home/cpyq/Desktop/OtterCTF.vmem'--profile=Wi......
  • Day12(2023.07.19)
    行程9:00到达上海电气集团数字科技有限公司(闵行区合川路2555号2号楼)9:30  听老师与公司负责人交谈11:30--13:00   吃饭休息13:30  听老师与公司负责人交谈15:00         实践windows安全检测16:30     ......
  • 代码随想录算法训练营第三十三天| 1049. 最后一块石头的重量 II 494. 目标和 474.一
    1049.最后一块石头的重量II思路:因为含有两个石头的相撞,所以需要把dp的目标值改成sum/2,然后取得这个目标值的最大值,然后对sum-2*target代码:1//要求:有多个石头,两两撞击,取得剩下的石头的最小值2//——》一定要碰到最后一个3//注意:4//1,x==y:两个粉碎,x<y:y=......
  • 代码随想录算法训练营第57天 | ● 647. 回文子串 ● 516.最长回文子序列 ● 动
     第九章 动态规划part17●  647. 回文子串  ●  516.最长回文子序列●  动态规划总结篇 今天 我们就要结束动态规划章节了,大家激不激动!!!   详细布置   647. 回文子串    动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。https:......
  • 代码随想录算法训练营第58天 | ● 739. 每日温度 ● 496.下一个更大元素 I - 第1
     第十章 单调栈part01 ●  739. 每日温度 ●  496.下一个更大元素 I    详细布置    739. 每日温度  今天正式开始单调栈,这是单调栈一篇扫盲题目,也是经典题。 大家可以读题,思考暴力的解法,然后在看单调栈的解法。 就能感受出单调栈的巧妙 ......