每日算法-250419

news2025/5/11 4:03:36

每日算法 - 2024年4月19日

记录今天完成的LeetCode算法题。


1710. 卡车上的最大单元数

题目描述

在这里插入图片描述

思路

贪心

解题过程

目标是最大化卡车可以装载的单元总数。根据贪心策略,我们应该优先装载单位体积(每个箱子)包含单元数 (numberOfUnitsPerBoxi) 最多的箱子。这样可以保证在有限的卡车容量下,获得尽可能多的单元数。

  1. 排序:将 boxTypes 数组按照每个箱子的单元数 (boxType[1]) 进行降序排序。
  2. 遍历装载:遍历排序后的 boxTypes 数组。
    • 对于每种类型的箱子,检查卡车剩余容量 truckSize
    • 如果 truckSize 大于等于当前类型箱子的数量 (boxType[0]),则将所有该类型的箱子装上卡车。更新总单元数 sum,并减少 truckSize
    • 如果 truckSize 小于当前类型箱子的数量,则只装载 truckSize 个该类型的箱子。更新总单元数 sum,此时卡车已满,可以直接结束遍历。
  3. 返回最终计算得到的总单元数 sum

复杂度分析

  • 时间复杂度: O(N log N),其中 N 是 boxTypes 的长度。主要开销在于对 boxTypes 数组的排序。
  • 空间复杂度: O(log N)O(N),取决于排序算法使用的额外空间(例如,Java中 Arrays.sort 对对象数组通常使用归并排序或TimSort,可能需要 O(N) 的空间,或优化后接近 O(log N) 的递归栈空间)。

代码实现

class Solution {
    public int maximumUnits(int[][] boxTypes, int truckSize) {
        // 按一维数组第二个元素对二维数组进行降序排序
        Arrays.sort(boxTypes, (arr1, arr2) -> Integer.compare(arr2[1], arr1[1]));
        int sum = 0;
        for (int[] boxType : boxTypes) {
            if (truckSize >= boxType[0]) {
                sum += (boxType[0] * boxType[1]);
            } else {
                sum += (truckSize * boxType[1]);
                break;
            }
            truckSize -= boxType[0];
        }
        return sum;
    }
}

1338. 数组大小减半

题目描述

在这里插入图片描述

思路

贪心

解题过程

题目要求我们返回一个整数集合的最小大小,使得移除数组中所有属于该集合的整数后,数组的大小至少减半。根据贪心策略,我们应该优先移除出现次数最多的整数。每次移除当前频率最高的整数,可以最快地减少数组的元素数量,从而用最少的整数种类达到减半的目标。

  1. 统计频率:使用哈希表(HashMap)统计数组 arr 中每个整数的出现次数。
  2. 提取频率:将哈希表中所有不同的频率值提取到一个新的数组 values 中。
  3. 排序频率:对 values 数组进行升序排序。
  4. 贪心选择:初始化目标移除数量 n = arr.length / 2 和结果集合大小 ret = 0。从 values 数组的末尾(即最大频率)开始向前遍历。
    • 在每一步中,将当前频率 values[i]n 中减去,表示移除了这么多元素。
    • 同时,将 ret 加 1,表示选择了一个新的整数加入到移除集合中。
    • n 小于等于 0 时,说明移除的元素总数已达到或超过数组长度的一半,此时的 ret 就是所需的最小集合大小,停止遍历。
  5. 返回 ret

复杂度分析

  • 时间复杂度: O(N log N)。统计频率需要 O(N)。将频率存入数组并排序需要 O(M log M),其中 M 是数组中不同元素的数量(M <= N)。在最坏情况下 M 接近 N,所以总体复杂度为 O(N log N)
  • 空间复杂度: O(N)。哈希表和存储频率的数组 values 在最坏情况下可能需要存储 N 或接近 N 个条目/元素。

代码实现

class Solution {
    public int minSetSize(int[] arr) {
        Map<Integer, Integer> hash = new HashMap<>();
        for (int x : arr) {
            hash.put(x, hash.getOrDefault(x, 0) + 1);
        }
        int size = hash.size();
        int[] values = new int[size];
        int index = 0;
        for (int x : hash.values()) {
            values[index++] = x;
        }
        Arrays.sort(values);
        int n = arr.length / 2, ret = 0;
        for (int i = size - 1; i >= 0; i--) {
            n -= values[i];
            ret++;
            if (n <= 0) {
                break;
            }
        }
        return ret;
    }
}

3010. 将数组分成最小总代价的子数组 I

题目描述

在这里插入图片描述

思路

贪心

解题过程

题目要求将数组 nums 分成三个非空子数组,并最小化这三个子数组的第一个元素之和(即总代价)。

  1. 固定第一个元素:根据规则,第一个子数组必须从 nums[0] 开始,所以 nums[0] 必然是总代价的一部分。
  2. 寻找最小的另外两个元素:我们需要确定第二和第三个子数组的起始元素,使得它们的和加上 nums[0] 最小。这两个起始元素必须来自 nums 数组中索引 1 到 n-1 的部分。为了使总代价最小,我们只需要在 nums[1]nums[n-1] 这个范围内找到两个值最小的元素即可。
  3. 贪心选择:由于子数组可以只有一个元素,我们可以将 nums[1]nums[n-1] 中最小的两个元素分别作为第二和第三个子数组的(唯一)元素。这样它们的代价就是这两个最小值。
  4. 实现:因此,最优策略是:
    • 保留 nums[0] 作为代价的一部分。
    • 对数组 nums 从索引 1 到 nums.length - 1 的部分进行升序排序。
    • 总代价就是 nums[0] 加上排序后子数组的前两个元素,即 nums[0] + nums[1] + nums[2](这里的 nums[1]nums[2] 是排序后的结果)。

复杂度分析

  • 时间复杂度: O(N log N),其中 N 是 nums 的长度。主要开销在于对 nums 数组从索引 1 开始的子数组进行排序。
  • 空间复杂度: O(log N)O(N),取决于排序算法使用的额外空间。

代码实现

class Solution {
    public int minimumCost(int[] nums) {
        Arrays.sort(nums, 1, nums.length);
        return nums[0] + nums[1] + nums[2];
    }
}

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

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

相关文章

PDF转excel+json ,vue3+SpringBoot在线演示+附带源码

在线演示地址&#xff1a;Vite Vuehttp://www.xpclm.online/pdf-h5 源码gitee前后端地址&#xff1a; javapdfexcel: javaPDF转excelhttps://gitee.com/gaiya001/javapdfexcel.git 盖亚/vuepdfhttps://gitee.com/gaiya001/vuepdf.git 后续会推出 前端版本跟nestjs版本 识别复…

如何高效使用 Text to SQL 提升数据分析效率?四个关键应用场景解析

数据分析师和业务人员常常面临这样的困境&#xff1a;有大量数据等待分析&#xff0c;但 SQL 编写却成为效率瓶颈。即使对于经验丰富的数据分析师来说&#xff0c;编写复杂 SQL 查询也需要耗费大量时间&#xff1b;而对于不具备 SQL 专业知识的业务人员&#xff0c;数据分析则更…

分享一个DeepSeek+自建知识库实现人工智能,智能回答高级用法。

这个是我自己搞的DeepSeek大模型自建知识库相结合到一起实现了更强大的回答问题能力还有智能资源推荐等功能。如果感兴趣的小伙伴可以联系进行聊聊&#xff0c;这个成品已经有了实现了&#xff0c;所以可以融入到你的项目&#xff0c;或者毕设什么的还可以去参加比赛等等。 1.项…

jangow靶机笔记(Vulnhub)

环境准备&#xff1a; 靶机下载地址&#xff1a; https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova kali地址&#xff1a;192.168.144.128 靶机&#xff08;jangow&#xff09;地址&#xff1a;192.168.144.180 一.信息收集 1.主机探测 使用arp-scan进行主机探…

PyTorch `flatten()` 和 `squeeze()` 区别

PyTorch flatten() 和 squeeze() 区别 在 PyTorch 里,flatten() 和 squeeze(0) 是两个不同的张量操作, 1. flatten() 方法 flatten() 方法用于把一个多维张量展开成一维张量。它会将张量里的所有元素按顺序排列成一个一维序列。 语法 torch.flatten(input, start_dim=

wordpress SMTP配置qq邮箱发送邮件,新版QQ邮箱授权码获取方法

新版的QQ邮箱界面不同了&#xff0c;以下是新版的设置方法&#xff1a; 1. 进入邮箱后&#xff0c;点右上角的设置图标&#xff1a; 2. 左下角的菜单里&#xff0c;选择“账号与安全” &#xff1a; 3. 然后如下图&#xff0c;开启SMTP 服务&#xff1a; 4. 按提示验证短信&am…

2025年最新版 Git和Github的绑定方法,以及通过Git提交文件至Github的具体流程(详细版)

文章目录 Git和Github的绑定方法与如何上传至代码仓库一. 注册 GitHub 账号二.如何创建自己的代码仓库&#xff1a;1.登入Github账号&#xff0c;完成登入后会进入如下界面&#xff1a;2.点击下图中红色框选的按钮中的下拉列表3.选择New repostitory4.进入创建界面后&#xff0…

基于LSTM-AutoEncoder的心电信号时间序列数据异常检测(PyTorch版)

心电信号&#xff08;ECG&#xff09;的异常检测对心血管疾病早期预警至关重要&#xff0c;但传统方法面临时序依赖建模不足与噪声敏感等问题。本文使用一种基于LSTM-AutoEncoder的深度时序异常检测框架&#xff0c;通过编码器-解码器结构捕捉心电信号的长期时空依赖特征&#…

JavaScript中的Event事件对象详解

一、事件对象&#xff08;Event&#xff09;概述 1. 事件对象的定义 event 对象是浏览器自动生成的对象&#xff0c;当用户与页面进行交互时&#xff08;如点击、键盘输入、鼠标移动等&#xff09;&#xff0c;事件触发时就会自动传递给事件处理函数。event 对象包含了与事件…

王牌学院,25西电通信工程学院(考研录取情况)

1、通信工程学院各个方向 2、通信工程学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、信息与通信工程25年相较于24年上升5分、军队指挥学25年相较于24年上升30分 2、新一代电子信息技术&#xff08;专硕&#xff09;25年相较于24年下降25分、通信工程&…

深入理解 Java 多线程:锁策略与线程安全

文章目录 一、常见的锁策略1. 乐观锁&&悲观锁2. 读写锁3. 重量级锁&&轻量级锁4. 自旋锁5. 公平锁&&不公平锁6. 可重入锁 && 不可重入锁 二、CAS1. 什么是 CAS2. CAS 是怎么实现的3.CAS 有哪些应用1) 实现原子类2) 实现自旋锁 4. CAS 的 ABA 问…

Java数据结构——ArrayList

Java中ArrayList 一 ArrayList的简介二 ArrayList的构造方法三 ArrayList常用方法1.add()方法2.remove()方法3.get()和set()方法4.index()方法5.subList截取方法 四 ArrayList的遍历for循环遍历增强for循环(for each)迭代器遍历 ArrayList问题及其思考 前言 ArrayList是一种 顺…

科学量化AI对品牌产品印象 首个AI印象(AII)指数发布

2025年4月18日&#xff0c;营销传播数据研究领先机构四度传播研究院(SAC)&#xff0c;正式推出了量化AI大模型对产品整体印象的AI印象&#xff0c;简称AII&#xff08;ARTIFICIAL INTELLIGENCE IMPRESSIONS&#xff09;&#xff0c;同时发布了首个“汽车AI印象榜”。为企业和消…

FFmpeg 硬核指南:从底层架构到播放器全链路开发实战 基础

目录 1.ffmpeg的基本组成2.播放器的API2.1 复用器阶段2.1.1 分配解复用上下文2.1.2 文件信息操作2.1.3 综合示例 2. 2 编解码部分2.2.1 分配解码器上下文2.2.2编解码操作2.2.3 综合示例 3 ffmpeg 内存模型3.1 基本概念3.2API 1.ffmpeg的基本组成 模块名称功能描述主要用途AVFo…

UE5有些场景的导航生成失败解决方法

如果导航丢失&#xff0c;就在项目设置下将&#xff1a; 即可解决问题&#xff1a; 看了半个小时的导航生成代码发现&#xff0c;NavDataSet这个数组为空&#xff0c;导致异步构建导航失败。 解决 NavDataSet 空 无法生成如下&#xff1a; 当 NavDataSet 为空的化 如果 bAut…

MCP(Model Context Protocol 模型上下文协议)科普

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由人工智能公司 Anthropic 于 2024年11月 推出的开放标准协议&#xff0c;旨在为大型语言模型&#xff08;LLM&#xff09;与外部数据源、工具及服务提供标准化连接&#xff0c;从而提升AI在实际…

健康养生指南

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。它不仅关乎身体的强健&#xff0c;更是提升生活质量、预防疾病的关键。掌握科学的养生方法&#xff0c;能让我们在岁月流转中始终保持活力。 饮食是健康养生的基础。遵循 “均衡膳食” 原则&#xff0c;每日饮食需…

Linux系统:进程终止的概念与相关接口函数(_exit,exit,atexit)

本节目标 理解进程终止的概念理解退出状态码的概念以及使用方法掌握_exit与exit函数的用法以及区别atexit函数注册终止时执行的函数相关宏 一、进程终止 进程终止&#xff08;Process Termination&#xff09;是指操作系统结束一个进程的执行&#xff0c;回收其占用的资源&a…

Linux下 文件的查找、复制、移动和解压缩

1、在/var/log目录下创建一个hehe.log的文件&#xff0c;其文件内容是&#xff1a; myhostname ghl mydomain localdomain relayhost [smtp.qq.com]:587 smtp_use_tls yes smtp_sasl_auth_enable yes smtp_sasl_security_options noanonymous smtp_sasl_tls_security_opt…

C语言学习之预处理指令

目录 预定义符号 #define的应用 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 函数和宏定义的区别 #和## #运算符 ##运算符 命名约定 #undef ​编辑 命令行定义 条件编译 头文件包含 头文件被包含的方式 1.本地头文件包含 2.库文件包含 …