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

news2024/9/23 13:19:57

文章目录

  • 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 - i
            if (leftFlowers >= 0) {                     // 有剩余的花,说明后缀全是full
                // 计算最长前缀的长度。// 剩余的花够补到flowers[x]
                while (x < i && (long)flowers[x] * x - sumFlowers <= leftFlowers) { 
                    // 计算前缀已有花的总数
                    sumFlowers += flowers[x++];         
                }
                long beauty = (n - i) * full;
                // x > 0 说明有前缀,需要确保不会前缀的各个取值不会大于target
                if (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) {                   // 删去最靠前的1
                sum -= 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全选也会<=k
        if (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.coloradmin.cn/o/728313.html

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

相关文章

一分钟带你创建百万测试数据,玩转软件测试

准备测试数据是软件测试中非常重要的一个环节&#xff0c;无论是手工测试、动化测试还是性能测试&#xff0c;生成大量测试数据以评估性能是一项重要任务。 然而&#xff0c;寻找合适的测试数据并确保其质量常常是一项繁琐且耗时的工作。 先来看一下准备测试数据常见的四类方法…

Vue 实时显示时间

Vue 实时显示时间 getNowTime() {setInterval(() > {const date new Date();var year date.getFullYear();var month (date.getMonth() 1).toString().padStart(2, "0");var day date.getDate().toString().padStart(2, "0");var hours date.ge…

人工智能商业变现途径,并介绍详细公司案列

目录 1. 推荐系统&#xff1a;2. 智能广告和营销&#xff1a;3. 聊天机器人和虚拟助手&#xff1a;4. 自动化和机器人化&#xff1a;5. 数据分析和预测&#xff1a;6. 机器视觉和图像识别&#xff1a;7. 金融科技&#xff08;FinTech&#xff09;&#xff1a;8. 医疗诊断和健康…

【成长之路】nginx配置https遇到的一系列问题

问题一&#xff1a;拿到手的文件并没有网上说的crt和key&#xff0c;而是一个cer、key和csr 按照网上说的&#xff0c;将cer转成pem文件&#xff0c;配置之后确实好使了 server {listen 443 ssl;ssl_certificate /opt/nginx/conf/域名.cer;ssl_certificate_key /opt/nginx/co…

诚迈科技董事长、统信软件董事长王继平出席全球数字经济大会

7月5日&#xff0c;2023全球数字经济大会“数字未来新一代软件产业高质量发展论坛”在北京大兴隆重举行。论坛以“数字新高地&#xff0c;数创兴未来”为主题&#xff0c;共同探讨产业升级新路径&#xff0c;凝聚数字经济合作新共识&#xff0c;构建数字产业集聚发展新高地。诚…

python接口自动化之DDT数据驱动测试

一、简单介绍 DDT&#xff08;Date Driver Test&#xff09;&#xff0c;所谓数据驱动测试&#xff0c;简单来说就是由数据的改变从而驱动自动化测试的执行&#xff0c;最终引起测试结果的改变。通过使用数据驱动测试的方法&#xff0c;可以在需要验证多组数据测试场景中&…

YApi-高效、易用、功能强大的可视化接口管理平台——(二)YApi 分组权限

YApi 分组权限 认识 YApi角色划分项目权限分组权限分组操作创建分组项目列表添加成员分组删除 认识 YApi YApi 是一个开源的接口管理平台&#xff0c;可以方便地管理和测试 API 接口&#xff0c;支持接口文档自动生成、Mock 数据生成、接口测试和接口监控等功能。YApi 支持多人…

TCP 协议报文

TCP 提供面向连接的通信传输&#xff0c;面向连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接服务&#xff0c;连接…

ATFX国际:大非农数据来袭,美国劳动力市场需求或空前旺盛

ATFX国际&#xff1a;昨日晚间公布的ADP数据震惊市场&#xff0c;新增就业人口高达49.7万人&#xff0c;而预期值仅为22.8万人&#xff0c;前值也只有26.7万人。公布值约为预期值和前值的总和。 ▲ATFX图 ADP数据是非农就业报告的前瞻指标&#xff0c;前者表现亮眼&#xff0c…

vue 表单校验不通过问题

记录 vue element 表单验证有值但验证失败问题 <el-form ref"form" :model"form" :rules"rules" class"baseForm"label-width"160px"><div class"sub-body"><el-row><el-col :span"24…

simulink 查表模块lookup table

一维查表 及样条曲线 或者m脚本 clear; x [1 2 3 4 5]; y [1 3 5 3 1];%二维表格 x1 [1 2 3]; x2 [1 2 3 4 5]; y2 [1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15];%三维表格 k1 [1 2 3]; k2 [1 2 3]; k3 [1 2 3 4 5];for i 1:1:3for j 1:1:3for k 1:1:5y3(i,j,k) ijk;…

数学建模常用算法之Logistic回归

数学建模常用算法之Logistic回归 目录一元回归一元线性回归一元非线性回归 多元回归逐步回归logistic回归 目录 一元回归 一元线性回归 最小二乘法 设&#xff1a; ybxa即可求得 %% 输入数据 clc, clear all, close all x[23.80,27.60,31.60,32.40,33.70,34.90,43.20,52.80…

Zabbix 的使用

Zabbix 的使用 一、添加 zabbix 客户端主机1.1 环境准备1.2 服务端和客户端都配置时间同步1.3 服务端和客户端都设置 hosts 解析1.4 设置 zabbix 的下载源&#xff0c;安装 zabbix-agent21.5 修改 agent2 配置文件1.6 启动 zabbix-agent21.7 在服务端验证 zabbix-agent2 的连通…

粮油溯源系统源码 全流程可视化质量溯源系统源码

粮油质量溯源系统源码 粮油溯源系统是从种植到加工、包装、库存、物流、销售、售出、异常反馈的全流程可视化质量溯源系统。 粮油安全关系千千万万消费者的健康问题。近年来&#xff0c;许多食品行业安全事故频频涌现&#xff0c;成为社会关注焦点。粮油做为人们生活饮食中的…

jpa使用uuid策略后无法手动设置id的问题

实体对象定义如下&#xff1a; Data Entity Table(name "sys_user") public class UserDO {/** 用户id */IdGenericGenerator(name "uuid", strategy "org.hibernate.id.UUIDGenerator")GeneratedValue(generator "uuid")Column(…

linux ifconfig: command not found

ifconfig 报 -bash: ifconfig: command not found 此时我们查看 /sbin 目录&#xff0c;会发现他是没有 ifconfig 相关文件的 ls | grep ifconfig # 查看不到相关文件 ip addr 后显示 ens33没有ip地址 发现 ens33 没有 inet 这个属性&#xff0c;那么就没法通过IP地…

【Distributed】分布式监控系统zabbix应用(二)

文章目录 一、部署 Zabbix 代理服务器1. 分布式监控的作用2. 部署过程2.1 设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy2.2 部署数据库2.3 导入数据库信息2.4 修改 zabbix-proxy 配置文件2.5 启动 zabbix-proxy2.6 在所有主机上配置 hosts 解析2.7 在 Web 页面配置 agen…

iOS打包IPA教程

转载&#xff1a;xcode打包导出ipa 众所周知&#xff0c;在开发苹果应用时需要使用签名&#xff08;证书&#xff09;才能进行打包安装苹果 IPA&#xff0c;作为刚接触ios开发的同学&#xff0c;只是学习ios app开发内测&#xff0c;并没有上架appstore需求&#xff0c;对于苹…

算法----Nim 游戏

题目 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数&a…

华为OD机试真题 Python 实现【字符串重新排序】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出 一、题目描述 给定一个字串s&#xff0c;s包含以空格分隔的若干个单词&#xff0c;请对s进行如下处理后输出&#xff1a; 1、单词内部调整 对每个单词字母重新按字典序…