【LeetCode周赛】2022上半年题目精选集——贪心

文章目录

  • 2136. 全部开花的最早一天(贪心)⭐⭐⭐⭐⭐
      • 思路
      • 代码
        • 语法解析:Integer[] id = IntStream.range(0, plantTime.length).boxed().toArray(Integer[]::new);
  • 2141. 同时运行 N 台电脑的最长时间(贪心)⭐⭐⭐⭐⭐
    • 解法1——二分答案
    • 解法2——排序+贪心
      • 思路
      • 代码
  • 2234. 花园的最大总美丽值(贪心)
  • 2311. 小于等于 K 的最长二进制子序列(贪心)
    • 解法1——双指针删去最前面的1
    • 解法2——分类讨论+贪心
      • 补充:public static int numberOfLeadingZeros​(int i)
      • 补充:public static int parseInt​(String s, int radix) throws NumberFormatException

2136. 全部开花的最早一天(贪心)⭐⭐⭐⭐⭐

2136. 全部开花的最早一天
难度:2033
在这里插入图片描述

思路

贪心省流版:
花期越长的,越早种植。

完整版:
参见
https://leetcode.cn/problems/earliest-possible-day-of-full-bloom/solutions/1202113/quan-bu-kai-hua-de-zui-zao-yi-tian-by-le-ocxg/
https://leetcode.cn/problems/earliest-possible-day-of-full-bloom/solutions/1200254/tan-xin-ji-qi-zheng-ming-by-endlesscheng-hfwe/

代码

class Solution {public int earliestFullBloom(int[] plantTime, int[] growTime) {Integer[] id = IntStream.range(0, plantTime.length).boxed().toArray(Integer[]::new);Arrays.sort(id, (i, j) -> growTime[j] - growTime[i]);   // 按照开花时间降序排序int ans = 0, day = 0;for (int i : id) {day += plantTime[i];ans = Math.max(ans, day + growTime[i]);}return ans;}
}

语法解析:Integer[] id = IntStream.range(0, plantTime.length).boxed().toArray(Integer[]::new);

生成0~plantTime.length - 1的 int 流,然后装箱即转成Integer,最后使用 toArray() 转成数组类型。

注意:这里 toArray() 中必须使用 Integer[]::new,因为这是 Stream 类的 toArray() 方法,
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/Stream.html#toArray(java.util.function.IntFunction),它返回一个包含此流元素的数组,使用提供的生成器函数来分配返回的数组,以及分区执行或调整大小所需的任何其他数组。
在这里插入图片描述

ArrayList 的 toArray 操作如下:
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ArrayList.html#toArray(T[])
在这里插入图片描述

2141. 同时运行 N 台电脑的最长时间(贪心)⭐⭐⭐⭐⭐

2141. 同时运行 N 台电脑的最长时间

难度:2265

在这里插入图片描述
提示:

1 <= n <= batteries.length <= 10^5
1 <= batteries[i] <= 10^9

解法1——二分答案

在这里插入图片描述
二分是 log ,判断合不合理是 n。
其中判断是否合理的方法基于:电量 > x 的只能被使用 x ,小于 x 的可以充分使用,最后计算这些可用电量之和能否支持 n 个机器运行 x 时长。

class Solution {public long maxRunTime(int n, int[] batteries) {long l = 0, r = (long)1e15;while (l < r) {long mid = l + r + 1 >> 1;if (op(n, batteries, mid)) l = mid;else r = mid - 1;}return l;}public boolean op(int n, int[] batteries, long k) {long sum = 0;for (int battery: batteries) sum += Math.min(battery, k);return n <= sum / k;	// 这里不能写成 n * k <= sum; 否则会产生溢出问题}
}

解法2——排序+贪心

思路

在这里插入图片描述

代码

核心思想就是:先把大的不能充分利用的都给删掉,剩下的小的都可以充分使用所以直接返回 sum / n。

class Solution {public long maxRunTime(int n, int[] batteries) {long sum = 0;for (int battery: batteries) sum += battery;Arrays.sort(batteries);for (int i = batteries.length - 1; i >= 0; --i) {int battery = batteries[i];if (battery <= sum / n) {return sum / n;     // 剩下的电池都比较小,都可以充分使用} else {// 消耗掉这个电池sum -= battery;n--;}}return 0;}
}

2234. 花园的最大总美丽值(贪心)

2234. 花园的最大总美丽值
难度:2561

在这里插入图片描述
在这里插入图片描述


思路是先假设所有花园都可以补到 target ,这时候计算还剩多少个可以用的花朵。

然后从前往后枚举不能补到 target 的前缀,将可以用的花朵逐渐增加,在这个过程中计算不完善花园的最小值最大可以是多少 (leftFlowers + sumFlowers)/ x。

并且在这个枚举过程中不断通过 Math.max() 更新答案。

class Solution {public long maximumBeauty(int[] flowers, long newFlowers, int target, int full, int partial) {long n = flowers.length;Arrays.sort(flowers);  // 升序排序if (flowers[0] >= target) return n * full;// 填充后缀后剩余可以使用的花朵long leftFlowers = newFlowers - target * n; for (int i = 0; i < n; ++i) {flowers[i] = Math.min(flowers[i], target);  // 计算多余的花leftFlowers += flowers[i];}long ans = 0L, sumFlowers = 0L;for (int i = 0, x = 0; i <= n; ++i) {           // 枚举后缀长度 n - iif (leftFlowers >= 0) {                     // 有剩余的花,说明后缀全是full// 计算最长前缀的长度。// 剩余的花够补到flowers[x]while (x < i && (long)flowers[x] * x - sumFlowers <= leftFlowers) { // 计算前缀已有花的总数sumFlowers += flowers[x++];         }long beauty = (n - i) * full;// x > 0 说明有前缀,需要确保不会前缀的各个取值不会大于targetif (x > 0) beauty += Math.min((leftFlowers + sumFlowers) / x, (long)target - 1) * partial;      ans = Math.max(ans, beauty);            // 更新答案}// i不需要补到target,剩余的花数量增加if (i < n) leftFlowers += target - flowers[i];  }return ans;}
}

2311. 小于等于 K 的最长二进制子序列(贪心)

2311. 小于等于 K 的最长二进制子序列

难度:1839

在这里插入图片描述

注意是最长子序列 而不是 最长连续子序列。

解法1——双指针删去最前面的1

前导零不会影响二进制数字的大小,当数字过大时,不断删去最开头的1知道数字满足条件即可。

class Solution {public int longestSubsequence(String s, int k) {int n = s.length(), sum = 0, ans = 0, t = 0;List<Integer> nums = new LinkedList();  // 记录1出现的位置for (int i = 0; i < n; ++i) {++t;sum = sum * 2;if (s.charAt(i) == '1') {sum++;nums.add(i);}while (sum > k) {                   // 删去最靠前的1sum -= 1 << (i - nums.get(0));nums.remove(0);--t;}ans = Math.max(ans, t);}return ans;}
}

解法2——分类讨论+贪心

在这里插入图片描述

直接看代码中的注释就可以理解思路了。

class Solution {public int longestSubsequence(String s, int k) {// m是k的2进制中从第一个1到最右边的位数int n = s.length(), m = 32 - Integer.numberOfLeadingZeros(k);// 如果n<m,那么s全选也会<=kif (n < m) return n;// 按2进制解析s.substring(n - m)的数值,<=k就可以全选这部分,否则需要删除1位var ans = Integer.parseInt(s.substring(n - m), 2) <= k ? m : m - 1;// 给结果加上前面的所有0的数量return ans + (int) s.substring(0, n - m).chars().filter(c -> c == '0').count();}
}

补充:public static int numberOfLeadingZeros​(int i)

在这里插入图片描述

返回指定int值的二进制补码表示中最高阶(“最左边”)一位之前的零位数。如果指定的值在其二进制补码表示中没有一位,即等于零,则返回32。

与之相对的还有:public static int numberOfTrailingZeros​(int i)
在这里插入图片描述
返回指定int值的二进制补码表示形式中的最低阶(“最右边”)一位之后的零位数。如果指定的值在其二进制的补码表示中没有一位,即等于零,则返回32。

补充:public static int parseInt​(String s, int radix) throws NumberFormatException

public static int parseInt​(String s, int radix) throws NumberFormatException
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html#parseInt(java.lang.String,int)
在这里插入图片描述

将字符串参数解析为第二个参数指定基数的带符号整数。

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

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

相关文章

【大数据实战电商推荐系统】概述版

文章目录 第1章 项目体系框架设计&#xff08;说明书&#xff09;第2章 工具环境搭建&#xff08;说明书&#xff09;第3章 项目创建并初始化业务数据3.1 IDEA创建Maven项目&#xff08;略&#xff09;3.2 数据加载准备&#xff08;说明书&#xff09;3.3 数据初始化到MongoDB …

Flink DataStream之Connect合并流

新建类 package test01;import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.api.datastream.ConnectedStreams; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastre…

UE4 如何设置玩家Character的两个位置和角度之间的切换

问题&#xff1a;玩家Character的角度不能直接去设置其中的Camera角度&#xff0c;因为Camera的角度是由鼠标X/Y移动增量决定的&#xff0c;同时把Camera的角度传给PlayController中的PlayCameraManneger&#xff0c;PlayCameraManneger是所有Pawn类型的Camera视口总管&#xf…

数据库练习

数据库练习 建立三张表&#xff0c;以及表中的联系 由于学生表中存在外键&#xff0c;所以我们需要先创建课程表和班级表 课程表 mysql> create table course(-> course_id int primary key auto_increment comment 课程编号,-> course_name varchar(10) not null…

SpringCloud Alibaba 面试题 微服务相关

Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 与微服务架构是一种分布式架构&#xff0c;它将复杂的应用系统拆分成若干可独立部署、可重复使用的微服务&#xff0c;以实现模块化&#xff0c;可靠性&#xff0c;可部署性的服务架构。 Spring Cloud Alibaba 集成了阿里巴巴…

MySQL数据库对象与数据备份和还原详解

目录 一、视图 1. 什么是视图 2. 视图与数据表的区别 3. 视图的优点 4. 创建视图 二、索引 1. 什么是索引 2. 为什么要使用索引 3. 索引优缺点 4. 何时不使用索引 5. 索引何时失效 6. 索引分类 6.1 普通索引 6.2 唯一索引 6.3 主键索引 6.4 组合索引 三、数据的…

【深度学习】AIGC ,ControlNet 论文,原理,训练,部署,实战,教程(三)

文章目录 源码资源下载Python环境试玩controlnet训练数据准备选一个Stable diffusion模型开始训练 第一篇&#xff1a;https://qq742971636.blog.csdn.net/article/details/131531168 源码资源下载 目前 ControlNet 1.1 还在建设&#xff0c;本文这里使用源码 https://github…

MyBatis 与 Hibernate 有哪些不同?

ORM框架的选择与适用场景 MyBatis和Hibernate都是Java领域中流行的面向关系型数据库的ORM&#xff08;对象关系映射&#xff09;框架。它们的共同目标是简化开发人员操作数据库的工作&#xff0c;提供便捷的持久化操作。然而&#xff0c;两者在设计理念和适用场景上有所不同。…

Centos7安装wordpress图文教程

宝塔面板安装WordPress有两种方法&#xff1a; 自己手动安装&#xff08;推荐&#xff09;宝塔后台一键部署跳转提示 推荐使用手动安装&#xff0c;因为一键部署的WordPress版本不是最新的&#xff0c;而且自己上传的文件比较放心。 第一步&#xff0c;上传WordPress安装包 …

Redis消息队列

消息队列&#xff1a;字面意思就是存放消息的队列。使用队列的好处在于解耦 。最简单的消息队列模型包括3个角色&#xff1a; 消息队列&#xff1a;存储和管理消息&#xff0c;也被称为消息代理&#xff08;Message Broker&#xff09; 生产者&#xff1a;发送消息到消息队列 …

蚂蚁内容安全平台天鉴入选“北京市人工智能行业赋能典型案例”

近日&#xff0c;“2023全球数字经济大会”人工智能高峰论坛在京召开。会议发布了一批人工智能行业赋能典型案例&#xff0c;为行业提供重要的示范效应&#xff0c;以推动大模型应用加速赋能千行百业。其中&#xff0c;蚂蚁集团旗下数字藏品平台“鲸探”及内容安全平台“天鉴”…

el-breadcrumb面包屑详解

el-breadcrumb面包屑详解 封装面包屑组件 <template><div class"crumb"><el-breadcrumb separator"/"><template v-for"(item,index) in levelList"><el-breadcrumb-item :key"item_ index">{{item.na…