每日算法-250429

每日 LeetCode 题解 (2025-04-29)

大家好!这是今天的 LeetCode 刷题记录,主要涉及几道可以使用贪心策略解决的问题。


2037. 使每位学生都有座位的最少移动次数

题目描述:
题目图片

思路

贪心

解题过程

要使总移动次数最少,直观的想法是让每个学生移动到离他“最近”的可用座位。我们可以证明,最优策略是将位置排序后的第 i 个学生分配到排序后的第 i 个座位。

想象一下,如果我们将学生和座位都按位置排序。假设学生 Astudents[i],座位 Bseats[j],学生 Cstudents[k],座位 Dseats[l]。如果 i < kj > l (即学生 A 的位置小于学生 C,但 A 被分配到了位置更大的座位 B,而 C 被分配到了位置更小的座位 D),那么交换他们的座位(A 去 D,C 去 B)会使得总移动距离 |students[i] - seats[l]| + |students[k] - seats[j]| 不会超过原来的移动距离 |students[i] - seats[j]| + |students[k] - seats[l]|

因此,最优解是将排序后的 seats 数组和 students 数组按索引一一对应。我们只需对 seatsstudents 数组进行排序,然后计算对应位置 seats[i]students[i] 之间距离的绝对值之和。

复杂度

  • 时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN),主要由排序 seatsstudents 数组决定,其中 N 是数组的长度。
  • 空间复杂度: O ( log ⁡ N ) O(\log N) O(logN) O ( N ) O(N) O(N),取决于排序算法使用的空间(例如,Java 的 Arrays.sort 对于基本类型数组通常使用快速排序,需要 O ( log ⁡ N ) O(\log N) O(logN) 的栈空间;对于对象数组使用 Timsort,可能需要 O ( N ) O(N) O(N) 的额外空间)。如果我们不考虑排序本身所需的辅助空间(或认为是在原地排序),可以认为是 O ( 1 ) O(1) O(1),但 O ( log ⁡ N ) O(\log N) O(logN) 更为严谨。

Code

class Solution {public int minMovesToSeat(int[] seats, int[] students) {Arrays.sort(seats);Arrays.sort(students);int n = students.length;int ret = 0;for (int i = 0; i < n; i++) {ret += Math.abs(seats[i] - students[i]);}return ret;}
}

455. 分发饼干

题目描述:
题目图片

思路

贪心

解题过程

目标是满足尽可能多的孩子。贪心策略是:优先满足胃口最小的孩子,并且用能满足他的最小的饼干。

为了实现这个策略:

  1. 将孩子的胃口数组 g 和饼干尺寸数组 s 都进行升序排序。
  2. 使用两个指针:i 指向当前考虑的孩子,j 指向当前考虑的饼干。
  3. 遍历孩子数组(i 从 0 开始)。对于孩子 g[i],在饼干数组中找到第一个尺寸大于或等于 g[i] 的饼干 s[j]
  4. 如果找到了这样的饼干 (s[j] >= g[i]),则这个孩子可以被满足。我们将满足的孩子数量 ret 加一,然后考虑下一个孩子 (i++) 和下一块饼干 (j++)。
  5. 如果当前的饼干 s[j] 小于 g[i],说明这块饼干无法满足当前的孩子,我们需要尝试更大的饼干,因此移动饼干指针 (j++),但仍然尝试满足同一个孩子 g[i]
  6. 当孩子指针 i 或饼干指针 j 超出数组范围时,停止过程。

复杂度

  • 时间复杂度: O ( G log ⁡ G + S log ⁡ S ) O(G \log G + S \log S) O(GlogG+SlogS),主要由排序两个数组决定。排序后的双指针(或类似逻辑的循环)遍历过程是线性的,时间复杂度为 O ( G + S ) O(G + S) O(G+S)。总时间复杂度由排序主导。 G 是孩子数量,S 是饼干数量。
  • 空间复杂度: O ( log ⁡ G + log ⁡ S ) O(\log G + \log S) O(logG+logS) O ( G + S ) O(G+S) O(G+S),同样取决于排序算法使用的空间。

Code

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int ret = 0;for (int i = 0, j = 0; i < g.length; i++) {for (; j < s.length;) {if (g[i] <= s[j++]) {ret++;break;}}}return ret;}
}

1433. 检查一个字符串是否可以打破另一个字符串

题目描述:
题目图片

思路

贪心

解题过程

字符串 s1 能 “打破” s2 是指存在一种 s1 的排列,使得对于所有位置 is1[i] 的字典序大于或等于 s2[i]

一个关键的贪心思想是:如果 s1 能够打破 s2,那么将 s1s2 按字典序排序后,排序后的 s1 必定也能打破排序后的 s2。这是因为排序将最小的字符对齐比较,次小的对齐比较,依此类推。如果存在任何一个 i 使得 sorted_s1[i] < sorted_s2[i],那么无论如何排列 s1,都不可能让 s1 的所有字符都大于等于 s2 对应位置的字符(考虑反证法或鸽巢原理)。

所以,解题步骤如下:

  1. 将两个字符串 ss1ss2 转换成字符数组 s1s2
  2. s1s2 进行排序。
  3. 检查排序后的 s1 是否能打破 s2 (即 s1[i] >= s2[i] 对所有 i 成立)。
  4. 同时检查排序后的 s2 是否能打破 s1 (即 s2[i] >= s1[i] 对所有 i 成立)。

我们可以用两个布尔变量 s1BreaksS2s2BreaksS1 来记录这两个条件是否满足。在一次遍历中,如果发现 s1[i] < s2[i],则 s1BreaksS2 置为 false;如果发现 s1[i] > s2[i] (等价于 s2[i] < s1[i]),则 s2BreaksS1 置为 false

最后,只要 s1BreaksS2s2BreaksS1 中至少有一个为 true,就返回 true

复杂度

  • 时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN),主要由排序字符数组决定,其中 N 是字符串的长度。遍历检查的过程是 O ( N ) O(N) O(N)
  • 空间复杂度: O ( N ) O(N) O(N),因为需要创建字符数组来存储和排序字符串内容。如果可以原地修改字符串(某些语言允许),且排序算法空间复杂度为 O ( log ⁡ N ) O(\log N) O(logN),则空间可以优化。在 Java 中,toCharArray() 创建了新数组,所以是 O ( N ) O(N) O(N)

Code

class Solution {public boolean checkIfCanBreak(String ss1, String ss2) {char[] s1 = ss1.toCharArray();char[] s2 = ss2.toCharArray();Arrays.sort(s1);Arrays.sort(s2);boolean s1BreakS2 = true;boolean s2BreakS1 = true;for (int i = 0; i < s1.length; i++) {if (s1[i] < s2[i]) {s1BreakS2 = false;}if (s1[i] > s2[i]) {s2BreakS1 = false;}}return s1BreakS2 || s2BreakS1;}
}

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

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

相关文章

yolov8+kalman 实现目标跟踪统计人流量

简述 最近接了毕业生的毕业设计题&#xff0c;想着帮帮忙&#xff0c;要使用机器视觉识别&#xff0c;追踪和逻辑统计的方式来统计人流&#xff0c;要求是满足下面特性 高精度&#xff1a;YOLOv8 提供高质量检测&#xff0c;卡尔曼滤波平滑跟踪。高效率&#xff1a;两者结合满…

Shopify网上商店GraphQL Admin接口查询实战

目录 一、Shopify网上商店 二、个人商店配置接口权限 三、PostMan调用接口测试 四、通过Java服务调用接口 一、Shopify网上商店 Shopify是由Tobi Ltke创办的加拿大电子商务软件开发商&#xff0c;总部位于加拿大首都渥太华&#xff0c;已从一家在咖啡店办公的 5人团队&…

【Tips】高效文献管理:Zotero 导入参考文献的多种方式详解

高效文献管理&#xff1a;Zotero 导入参考文献的多种方式详解 在学术研究中&#xff0c;高效管理参考文献是提升效率的关键。Zotero 作为一款强大的文献管理工具&#xff0c;提供了多种便捷的文献导入方式。以下结合文献题录完整性对比分析&#xff0c;为大家详细介绍 Zotero …

[AI]browser-use + web-ui 大模型实现自动操作浏览器

[AI]browser-use web-ui 大模型实现自动操作浏览器 介绍 官方地址&#xff1a;https://github.com/browser-use/web-ui browser-use主要作用是将 AI Agent 与浏览器链接起来从而实现由 AI 驱动的浏览器自动化。今天会给大家介绍如何通过browser-use web-ui来搭建并操作browse…

Springboot请求静态资源时,request.getServletPath() 返回error

大家好&#xff0c;我是 程序员码递夫。 SpringBoot请求静态资源时&#xff0c;request.getServletPath() 返回error&#xff0c; 明明我的目录文件是存在的怎么就报错了呢&#xff1f; 如我请求 http://127.0.0.1:9090/Hanfu/upload/1647161536390.png 通常是因为请求的资…

在开发板上如何处理curl: (60) SSL certificate problem

目录 引言 问题解析 解决方法 跳过证书验证 采用证书认证 结语 引言 最近一直推荐学生们在课程实验中使用curl及其libcurl。curl 是一个强大的命令行工具&#xff0c;用于在命令行中进行数据传输。它支持多种协议&#xff0c;如 HTTP、HTTPS、FTP、FTPS、SCP、SFTP 等。…

CSRF请求伪造

该漏洞主要是关乎于用户&#xff0c;告诫用户不可乱点击链接&#xff0c;提升自我防范&#xff0c;才能不落入Hacker布置的陷阱&#xff01; 1. cookie与session 简单理解一下两者作用 1.1. &#x1f36a; Cookie&#xff1a;就像超市的会员卡 存储位置&#xff1a;你钱包里…

Python循环与遍历详解:从入门到进阶

在Python编程中&#xff0c;循环和遍历是最基础但极其重要的知识点。理解并掌握这部分内容&#xff0c;是编写高效、清晰代码的前提。本文将从for循环和while循环的基本语法出发&#xff0c;逐步深入探讨range、enumerate、zip、列表推导式、字典遍历等Python中常见的遍历技巧&…

Python-MCPServer开发

Python-MCPServer开发 使用FastMCP开发【SSE模式的MCPServer】&#xff0c;熟悉【McpServer编码过程】【McpServer调试方法】 1-核心知识点 1-熟悉【SSE模式的MCPServer】开发2-熟悉【stdio模式的MCPServer】开发3-熟悉【启动MCPServer】的三种方式 3.1-直接启动:python mcp_s…

高级项目管理

在信息系统项目管理工作中&#xff0c;组织管理者和项目管理者&#xff0c;有时还会面临多项目的管理&#xff0c;或组织级的项目管理、项目的量化管理等课题。 其中&#xff0c;项目集管理、项目组合管理和组织级项目管理&#xff0c;为多项目管理和组织级管理提供有效指导&a…

tarjan缩点+强联通分量

【模板】缩点https://www.luogu.com.cn/problem/P3387 首先我们要理解这道题为什么要用缩点 题目说的是有向图&#xff0c;如果无环的话就可以用DP来解决了 由于可以走重复的点&#xff0c;所以一个环上的点可以看成是一个点&#xff0c;它的点权就等于该环上所有点的点权之…

OSCP:获取全交互式 Windows 反向 Shell

简介 在本文中&#xff0c;我们将探讨获取完全交互式 Windows 反向 Shell 的各种方法&#xff0c;从利用内置工具到采用先进技术以获得更好的控制和功能。 通过 Invoke-ConPtyShell 我获取完全交互式 Windows 反向 Shell 的首选方法是通过 Invoke-ConPtyShell 脚本。当 Wind…

免费超好用的电脑操控局域网内的手机(多台,无线)

使用 第一步 解压QtScrcpy压缩包&#xff0c;并运行QtScrcpy.exe 第二步 2.1 手机开启开发者模式&#xff08;设置>关于本机>版本信息>连点10下“版本号”&#xff09; 2.2 开启 USB调试 和 无线调试&#xff08;设置>开发者选项> USB调试 无线调试&#xf…

Go语言内存管理

本章节&#xff0c;就来学习一下go语言的内存模型&#xff0c;看一下内存的分配&#xff0c;存储都是如何实现的&#xff0c;与此同时&#xff0c;在正式开始今天的主题之前&#xff0c;首先先来学习操作系统基于这一方面的内容&#xff0c;来看看是如何管理内存的吧 本章及节…

【docker】启动临时MongoDB容器、挂载数据卷运行数据库服务,并通过备份文件恢复MongoDB数据库备份数据

‌启动临时 MongoDB 容器、挂载数据卷运行数据库服务&#xff0c;并通过备份文件恢复数据 1.命令分解与功能说明1.1.启动一个临时 MongoDB 容器‌&#xff0c;并进入交互式终端&#xff08;1&#xff09;执行命令&#xff08;2&#xff09;实现功能‌&#xff08;3&#xff09;…

【最新 MCP 战神手册 08】工具使用详解:实现 AI 行动

文章目录 1. 开始啦!2. 第一部分:设计高效且安全的工具3. 第二部分:定义工具蓝图——参数、输出与约束条件4. 第三部分:弥合差距:LLM 兼容性(函数调用)5. 第四部分:实施与测试的最佳实践1. 开始啦! 在前几章中,我们将工具介绍为 AI 模型在 MCP 客户端引导下向 MCP 服…

介绍 IntelliJ IDEA 快捷键操作

IntelliJ IDEA 快捷键操作 1. 编辑与导航2. 查找与替换3. 调试与运行4. 导航与视图5. 重构与生成6. 高级快捷键&#xff08;提高效率&#xff09;注意事项 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff0c;掌握其常用快捷键可以显著提升开发效率。但是有些小伙伴并不清…

Javascript 中作用域的理解?

一、作用域的类型 1. 全局作用域&#xff08;公司大门外&#xff09; 范围&#xff1a;整个 JavaScript 文件变量&#xff1a;像贴在公告栏上的信息&#xff0c;所有人可见例子&#xff1a;const companyName "阿里"; // 全局变量&#xff0c;任何地方都能访问 fu…

Leetcode刷题记录22——滑动窗口最大值

题源&#xff1a;https://leetcode.cn/problems/sliding-window-maximum/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述&#xff1a; 思路一&#xff1a; 暴力遍历法&#xff0c;通过一个长度为k的滑动窗口遍历nums&#xff0c;将其中最大的数依次记…

Apache Flink的架构设计与运行流程说明

在大数据领域&#xff0c;实时计算的重要性随着业务需求的爆发式增长愈发凸显。从电商的实时销量监控到金融的高频交易风控&#xff0c;从物联网设备的实时告警到社交平台的热点追踪&#xff0c;企业对“秒级甚至毫秒级”数据处理能力的需求已成为刚需。在众多实时计算框架中&a…