代码随想录 贪心算法-简单题目

目录

455.分发饼干 

1005.K次取反后最大化的数组和

860.柠檬水找零


455.分发饼干 

455. 分发饼干

简单

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例 1:

输入: g = [1,2,3], s = [1,1]
输出: 1
解释: 
你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。

示例 2:

输入: g = [1,2], s = [1,2,3]
输出: 2
解释: 
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.

提示:

  • 1 <= g.length <= 3 * 104
  • 0 <= s.length <= 3 * 104
  • 1 <= g[i], s[j] <= 231 - 1

用可满足该孩子的最小饼干去喂该孩子 

class Solution {  // 方法用于找到可以匹配的孩子和饼干的数量  public int findContentChildren(int[] g, int[] s) {  // 对孩子的胃口大小数组和饼干大小数组进行排序  Arrays.sort(g);  Arrays.sort(s);  // begin变量用于记录饼干数组当前检查的起始位置  int begin = 0;  // count变量用于记录成功匹配的孩子和饼干的数量  int count = 0;  // 遍历孩子的胃口大小数组  for(int i = 0; i < g.length; i++){  // 从begin开始遍历饼干大小数组  for(int j = begin; j < s.length; j++){  // 如果找到一块饼干的大小大于等于当前孩子的胃口  if(s[j] >= g[i]){  // 更新begin为当前饼干的后一个位置,这样下次就不需要再检查这块饼干  begin = j + 1;  // 匹配成功,count加1  count++;  // 跳出内层循环,继续检查下一个孩子的胃口  break;  }    }  }  // 返回成功匹配的孩子和饼干的数量  return count;  }  
}

1005.K次取反后最大化的数组和

1005. K 次取反后最大化的数组和

简单

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

示例 1:

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

示例 2:

输入:nums = [3,-1,0,2], k = 3
输出:6
解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。

示例 3:

输入:nums = [2,-3,-1,5,-4], k = 2
输出:13
解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。

提示:

  • 1 <= nums.length <= 104
  • -100 <= nums[i] <= 100
  • 1 <= k <= 104

排序后取反k次,优先取反负数,负数全部取反后,排序得到最小的非负数,对其进行k次取反后得到最大的sum 

class Solution {  // 方法用于计算在数组nums上进行k次取反操作后可能得到的最大和  public int largestSumAfterKNegations(int[] nums, int k) {  int sum = 0;  // 先对数组进行排序,这样负数会排在前面  Arrays.sort(nums);  // 遍历数组,将负数取反(如果k还有剩余并且当前数字是负数)  for(int i = 0; i < nums.length; i++){  if(k > 0 && nums[i] < 0){  nums[i] = -nums[i]; // 取反当前负数  k--; // k剩余次数减1  }  }  // 再次对数组进行排序,因为取反操作可能改变了数组的顺序  Arrays.sort(nums);  // 如果k还有剩余且为奇数,则将最小的数取反(这样可以得到最大和)  if(k > 0 && k % 2 == 1){  nums[0] = -nums[0];  }  // 计算排序后数组的总和  for(int i = 0; i < nums.length; i++){  sum += nums[i];  }  // 返回计算得到的最大和  return sum;  }  
}

 笨蛋写法,每次取反都取最小的

class Solution {public int largestSumAfterKNegations(int[] nums, int k) {int sum = 0;for(int i = 0; i < k; i++){Arrays.sort(nums);nums[0] = -nums[0];   }for(int i = 0; i < nums.length; i++){sum += nums[i];}return sum;}
}

860.柠檬水找零

860. 柠檬水找零

简单

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

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

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

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

示例 1:

输入:bills = [5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。

示例 2:

输入:bills = [5,5,10,10,20]
输出:false
解释:
前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
由于不是每位顾客都得到了正确的找零,所以答案是 false。

提示:

  • 1 <= bills.length <= 105
  • bills[i] 不是 5 就是 10 或是 20 

我的思路:因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!所以找零优先用10元面值 

class Solution {  // 判断是否能通过5元和10元找零满足所有顾客  public boolean lemonadeChange(int[] bills) {  // 使用一个数组来统计各个面额的纸币数量,数组下标代表纸币面额,从1到20  int[] count = new int[21];  // 遍历每张纸币  for(int i = 0; i < bills.length; i++){  // 当前纸币的面额出现次数加1  count[bills[i]] += 1;  // 需要的找零金额,初始值为当前纸币面额减去5int change = bills[i] - 5;  // 当需要找零的金额大于等于10,并且还有10元纸币可用时  while(change >= 10 && count[10] > 0){  // 使用一张10元纸币找零  count[10] -= 1;  // 更新找零金额,减去10  change -= 10;  }  // 当剩余的找零金额大于等于5,并且还有5元纸币可用时  while(change >= 5 && count[5] > 0){  // 使用一张5元纸币找零  count[5] -= 1;  // 更新找零金额,减去5  change -= 5;  }  // 如果找零金额仍然不为0,说明当前纸币无法找零  if(change != 0){  return false;  }  }  // 如果所有纸币都能成功找零,返回true  return true;  }  
}

 找零有如下三种情况:

  • 情况一:账单是5,直接收下。
  • 情况二:账单是10,消耗一个5,增加一个10
  • 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。

而情况三逻辑也不复杂甚至感觉纯模拟就可以了,其实情况三这里是有贪心的。

账单是20的情况,为什么要优先消耗一个10和一个5呢?

因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!

所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。

class Solution {  public boolean lemonadeChange(int[] bills) {  // five表示当前拥有的5元纸币数量  int five = 0;  // ten表示当前拥有的10元纸币数量  int ten = 0;  // 遍历顾客支付的每张纸币  for (int i = 0; i < bills.length; i++) {  // 如果当前纸币是5元  if (bills[i] == 5) {  // 增加5元纸币的数量  five++;  }   // 如果当前纸币是10元  else if (bills[i] == 10) {  // 需要找零5元,因此减少5元纸币的数量  five--;  // 增加10元纸币的数量  ten++;  }   // 如果当前纸币是20元  else if (bills[i] == 20) {  // 优先使用10元和5元纸币找零  if (ten > 0) {  // 如果有10元纸币,则使用一张10元纸币找零  ten--;  // 同时使用一张5元纸币找零  five--;  } else {  // 如果没有10元纸币,则使用三张5元纸币找零  five -= 3;  }  }  // 如果在找零过程中5元或10元纸币数量变为负数,说明无法找零,返回false  if (five < 0 || ten < 0) return false;  }  // 如果所有纸币都能成功找零,返回true  return true;  }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯 后端 一面(115min)

> 3.3投递 3.5测评 3.7约面 > 03.07 技术架构团队 一. 面试官介绍部门 二. 自我介绍 三. 拷打项目 1. 为什么、怎么用微服务架构改写 2. token无感刷新 3. ipfs用来干什么 为什么又用了minio 4. 怎么用redis做缓存的&#xff0c;缓…

小白也能上手的爬虫项目:从零开始学习数据抓取

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

基于51单片机的定时器时钟设计[proteus仿真]

基于51单片机的定时器时钟设计[proteus仿真] 时钟设计检测系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于51单片机的定时器时钟设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xffe5;&…

Git分支管理(Git分支的原理、创建、切换、合并、删除分支)

系列文章目录 文章一&#xff1a;Git基本操作 文章目录 系列文章目录前言一、Git分支是什么二、Git分支的原理三、创建分支四、切换分支五、合并分支六、删除分支 前言 在上一篇文章中&#xff0c;我们学习了如何使用Git的一些基本操作&#xff0c;例如安装Git、创建本地仓库…

IDEA编译安卓源码TVBox

因为电视x受限&#xff0c;无法观看电视直播&#xff0c;为了春晚不受影响&#xff0c;于是网络一顿搜索&#xff0c;试过多个APP&#xff0c;偶尔找到这款开源的TVBox&#xff0c;寒假在家&#xff0c;随便拿来练练手&#xff0c;学习安卓APP的编写&#xff0c;此文做以记录&a…

栈与队列的故事

​​​​​​​ 目录 ​编辑​​​​​​​ 一、栈 1.1栈的概念及结构 1.2栈的实现 1、实现支持动态增长的栈 2、初始化栈 3、入栈 4、出栈 5、获取栈顶元素 6、检测栈是否为空 7、获取栈中有效元素个数 8、销毁栈 9、测试 1.3源码 二、队列 2.1队列的概念及结构…

[C++] Windows中字符串函数的种类

文章目录 C标准库函数VC CRT函数Win32 APILinux C标准库函数 #include || #include <string.h> || #include 都可以使用以下函数&#xff1a; char *strcpy(char *dest, const char *src) //将Src字符串拷贝到Dst字符串地址。没有目标内存大小检查&#xff0c;可能会导致…

Python 强大邮件处理库 Imbox

目录 IMAP Mailbox Imbox 安装 特性 提取邮件内容 处理附件 安全性 示例 1&#xff1a;读取收件箱中的邮件 2&#xff1a;搜索并下载附件 3&#xff1a;连接到IMAP服务器获取所有邮件 结论 IMAP Mailbox IMAP&#xff08;Internet Message Access Protocol&#x…

解放生产力,AI加持你也能做这些事!

去年网上流行一个说法叫一人企业或超级IP。一个人就是一家公司&#xff0c;可以更加专注于自身核心技能。既能对工作拥有更大的自主性和控制力&#xff0c;又能舍弃了传统公司管理等繁琐的事务工作&#xff0c;可以全面释放自己的兴趣和潜力。 这个概念给笔者留下了比较深的印…

使用Julia语言和R语言实现K-均值

K-均值算法基础 K-均值聚类算法属于一种无监督学习的方法&#xff0c;通过迭代的方式将数据划分为K个不重叠的子集&#xff08;簇&#xff09;&#xff0c;每个子集由其内部数据点的平均值来表示。计算方法大体如下&#xff1a; 1.初始化簇中心 选择K个数据点作为初始的簇中心…

2024.3.9每日一题

LeetCode 找出数组的第 K 大和 题目链接&#xff1a;2386. 找出数组的第 K 大和 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数数组 nums 和一个 正 整数 k 。你可以选择数组的任一 子序列 并且对其全部元素求和。 数组的 第 k 大和 定义为&#xff1a;可…

实用软件分享之自动清理过期备份文件清理文件夹

实用软件分享之自动清理过期备份文件清理文件夹&#xff0c;单文件程序&#xff0c;把程序放在要清理的文件夹内&#xff0c;运行后&#xff0c;可以设置清理指定文件后缀&#xff0c;支持设置保留个数&#xff0c;按文件的修改时候&#xff0c;清理掉最早的文件 初步讲解&am…

【算法面试题】-04

执行时长 def min_execution_time(n, size, tasks):a 0ans sizei 0while i < size:tmp tasks[i]a tmpif a < n:a 0else:a - ni 1ans a // nif a % n ! 0:ans 1return ans# 读取输入 n int(input()) size int(input()) tasks list(map(int, input().split()))…

ElasticSearch之排序,fielddata和docvalue

写在前面 es搜索返回结果的排序默认是按照得分的高低来排的&#xff0c;本文来看下如何按照字段来排序&#xff0c;实现类似于MySQL的order by xxx的效果。 1&#xff1a;什么是fileddata和doc_value 参考ElasticSearch之零碎知识点 和一文带你彻底弄懂ES中的doc_values和fi…

[QT]自定义的QtabWidget

需求 最近有一个需求就是一个QTabWidget要求有四个tab页在左侧用于显示主页面&#xff0c;在右侧有一个关于按钮&#xff0c;点击后用于弹出窗口显示一些程序相关信息。主要是怎么实现右侧按钮 相关代码 #ifndef MYTABWIDGET_H #define MYTABWIDGET_H#include <QWidget&g…

[ROS 系列学习教程] rosbag C++ API

ROS 系列学习教程(总目录) 本文目录 一、rosbag::Bag1.1 常用接口1.2 其他接口 二、rosbag::View2.1 常用接口2.1.1 代码示例 rosbag 的 C API 主要有两个类&#xff0c;用于写bag文件的Bag类&#xff0c;和用于读bag文件的View类。 一、rosbag::Bag 用于写bag文件。 头文件…

Spring文件上传下载代码

Spring文件上传下载代码 文件上传 MultipartFile是SpringMVC提供简化上传操作的工具类。 /*** 文件上传接口** param file* return*/PostMapping("/fileUpload")public String fileUpload(RequestParam("file") MultipartFile file) {// 用户鉴权&#x…

集合和数组的相关操作

目录 1.数组转集合(引用类型数组) 2.数组转集合(基础类型数组) 3.集合转数组 4.集合之间是否相交 5.获取两个集合的交集 6.集合转为字符串 1.数组转集合(引用类型数组) (1)Arrays.asList 示例&#xff1a; String[] colArr new String[6];colArr[0] "1";co…

代码随想录刷题笔记 DAY 42 | 最后一块石头的重量 II No.1049 | 目标和 No.494 | 一和零 No.474

文章目录 Day 4301. 最后一块石头的重量 II&#xff08;No. 1049&#xff09;<1> 题目<2> 笔记<3> 代码 02. 目标和&#xff08;No. 494&#xff09;<1> 题目<2> 笔记<3> 代码 03. 一和零&#xff08;No. 474&#xff09;<1> 题目&l…

[C/C++]string类常用接口介绍及模拟实现string类

一&#xff1a;Cstring类的由来 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用…