35. 分发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。

相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

思路:

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

代码:

  1. class Solution {
  2. // 2023-7-21
  3. // 二刷 这种要考虑两边的题目,一般来说先确定一边
  4. // 再确定另一边
  5. // 两次遍历
  6. // 一次遍历右孩子大于左孩子 从前往后
  7. // 一次左孩子大于右孩子 必须从后往前,才能利用上一次的结果
  8. public int candy(int[] ratings) {
  9. int n = ratings.length;
  10. int[] candies = new int[n];
  11. Arrays.fill(candies, 1);
  12. // 从前往后 右孩子 > 左孩子
  13. for (int i = 1; i < n; i ++ ) {
  14. if (ratings[i] > ratings[i - 1]) {
  15. candies[i] = candies[i - 1] + 1;
  16. }
  17. }
  18. // 从后往前 左孩子 > 右孩子
  19. for (int i = n - 2; i >= 0; i --) {
  20. if (ratings[i] > ratings[i + 1]) {
  21. candies[i] = Math.max(candies[i], candies[i + 1] + 1);
  22. }
  23. }
  24. return Arrays.stream(candies).sum();
  25. }
  26. }

860. 柠檬水找零

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

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

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

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

思路:

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

代码:

  1. class Solution {
  2. // 2023-7-21
  3. // 代码随想录 二刷
  4. // 每杯柠檬水 5 美元
  5. public boolean lemonadeChange(int[] bills) {
  6. int five = 0, ten = 0; // 因为最大的面值为20,所以20元的钞票不在找零的范围内
  7. for (int bill : bills) {
  8. if (bill == 5) five ++;
  9. else if (bill == 10) {
  10. if (five == 0) return false; // 没有5美元的
  11. five --;
  12. ten ++;
  13. } else if (bill == 20){ // 优先用10 + 5 找钱,因为5比较万能
  14. if (five != 0 && ten != 0) {
  15. five --;
  16. ten --;
  17. } else if (five >= 3){
  18. five -=3;
  19. } else return false;
  20. }
  21. }
  22. return true;
  23. }
  24. }

406.根据身高重建队列

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

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

思路

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

代码

  1. class Solution {
  2. // 复习2023-4-20
  3. public int[][] reconstructQueue(int[][] people) {
  4. Arrays.sort(people, (a, b) -> {
  5. if (a[0] == b[0]) return a[1] - b[1]; // 身高一样的比较k,k小的在前 a - b是升序
  6. return b[0] - a[0]; // 身高不一样的比较身高,高的在前 b - a是降序
  7. });
  8. LinkedList<int[]> que = new LinkedList<>();
  9. for (int[] p : people) {
  10. que.add(p[1], p); // 把p插入到p[1] 及k的位置上
  11. }
  12. return que.toArray(new int[people.length][]);
  13. }
  14. }

代码随想录贪心专题-day1的更多相关文章

  1. 代码随想录-day1

    链表 今天主要是把链表专题刷完了,链表专题的题目不是很难,基本都是考察对链表的操作的理解. 在处理链表问题的时候,我们通常会引入一个哨兵节点(dummy),dummy节点指向原链表的头结点.这样,当我 ...

  2. [ACM]51nod 贪心专题

    目录 A 低买高卖 C 接水问题 D做任务一 E做任务三 51nod一个贪心专题,大多数都是见过的套路,做题找找感觉,有些题解思路懒得写了,直接贴毕姥爷的直播题解了 A 低买高卖 考虑股票市场,一共有 ...

  3. 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

    第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...

  4. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  5. 代码随想录 day0 博客怎么写

    前言 2.25日开始记录自己的博客生涯以及代码随想录训练营的每日内容 一.题目链接怎么找?怎么设置连接? 力扣题目链接1:力扣 二.正文怎么写? 二分查找 算法思路: 二分查找需要保证数组为有序数组同 ...

  6. 【LeetCode动态规划#05】背包问题的理论分析(基于代码随想录的个人理解,多图)

    背包问题 问题描述 背包问题是一系列问题的统称,具体包括:01背包.完全背包.多重背包.分组背包等(仅需掌握前两种,后面的为竞赛级题目) 下面来研究01背包 实际上即使是最经典的01背包,也不会直接出 ...

  7. 代码随想录训练营day 2 |977有序数组的平方 209.长度最小的子数组 (C++)

    977.有序数组的平方 题目链接:977.有序数组的平方 题目描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 例子如下: 输入 ...

  8. nyoj 71 独木舟上的旅行(贪心专题)

    独木舟上的旅行 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...

  9. 代码随想录第七天| 454.四数相加II、383. 赎金信 、15. 三数之和 、18. 四数之和

    第一题454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, ...

  10. 代码随想录第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    2022/09/22 第二天 第一题 这题我就直接平方后排序了,很无脑但很快乐啊(官方题解是双指针 第二题 滑动窗口的问题,本来我也是直接暴力求解发现在leetCode上超时,看了官方题解,也是第一次 ...

随机推荐

  1. 百度首页静态展示页面HTML+CSS

    一直觉得百度首页很复杂的,有那么多的东西,跟这个博主学习了之后,仿写了一下,样式好像很简单 只设置的一些组件的高度而已,不得不说,CSS真是个好东西呀 话不多说,直接上代码 <!DOCTYPE ...

  2. Spring之丐版IOC实现

    文章目录 IOC控制反转 依赖注入 Bean的自动装配方式 丐版IOC实现 BeanDefinition.java ResourceLoader.java BeanRegister.java Bean ...

  3. 从七个方面聊聊linux到底强在哪

    从事计算机相关行业的同学不难发现,身边总有一些朋友在学习linux,有的开发同学甚至自己的电脑就是它.经常听他们说linux如何好用等等.那么linux到底好在那里,能让大家如此喜欢.这也是我经常问自 ...

  4. 2021-09-26:搜索旋转排序数组。整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了

    2021-09-26:搜索旋转排序数组.整数数组 nums 按升序排列,数组中的值 互不相同 .在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.lengt ...

  5. Git开发、发布、缺陷分离模型概述(支持master/develop/feature/release/hotfix类型分支)

    Git是什么? Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发.Git最初是由Linux开发者Linus Torvalds创建的,它具有高效.灵活.稳定等优 ...

  6. Django4全栈进阶之路21 项目实战(在线报修):创建App应用和Model模型

    创建应用App python manage.py startapp RepairApp 创建模型 在models.py文件中定义一个Repair模型来表示报修单,其中包含以下字段: repair_id ...

  7. Windows server 2012 r2 激活方法

    slmgr /ipk W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9 slmgr /skms kms.03k.org slmgr /ato

  8. SQL Server 2014 英文版安装教程

    安装过程如下 1. 点击setup开始安装. 2. 选择如下的全新安装. 3. 自动生成产品密钥,然后点击下一步. 4. 勾选接受条款,然后点击下一步. 5. 自动更新根据实际情况进行选择,点击下一步 ...

  9. 【故障公告】博客站点一台阿里云负载均衡被DDoS攻击

    13:06 收到阿里云的电话与邮件通知,博客站点的一台阿里云负载均衡因被 DDoS 攻击被关进黑洞(所有访问被屏蔽),部分用户的访问受影响,由此给您带来麻烦,请您谅解. 您的IP:x.x.x.x 实例 ...

  10. Docker-Compose快速搭建LNMP

    Docker-Compose 1.安装Docker sudo apt -y install docker.io docker version 查看版本号 docker help 查看帮助文档 2.更换 ...