每日算法-250430

每日算法 - 2025年4月30日

记录下今天解决的两道题目。


870. 优势洗牌 (Advantage Shuffle)

题目描述

题目截图

解题思路与方法

核心思想:贪心策略 (田忌赛马)

这道题的目标是对于 nums1 中的每个元素,找到 nums2 中一个比它小的元素进行配对(如果可能),使得优势配对的数量最大化。如果 nums1 中的某个元素找不到 nums2 中可以战胜的对手,那么就用它去对付 nums2 中最强的对手,以保存 nums1 中更强的元素去对付 nums2 中可以战胜的对手。这类似于经典的“田忌赛马”策略。

具体步骤:

  1. 排序 nums1:将 nums1 升序排序,这样我们可以从小到大处理 nums1 中的元素。
  2. 排序 nums2 的索引:我们不能直接排序 nums2,因为需要保留其原始元素的下标信息以构建最终结果 ret。因此,我们创建一个索引数组 indexs,存储 0n-1。然后根据 nums2 中对应索引位置的元素值对 indexs 进行升序排序。排序后,indexs[0] 指向 nums2 中最小元素的原始索引,indexs[n-1] 指向 nums2 中最大元素的原始索引。
  3. 双指针分配
    • 使用两个指针 leftright 分别指向 indexs 数组的开始(对应 nums2 最小值)和结束(对应 nums2 最大值)。
    • 使用一个指针 i 遍历排序后的 nums1 (从 i=0 开始)。
    • 比较 nums1[i] (当前 nums1 中最小的可用元素) 和 nums2[indexs[left]] (当前 nums2 中最小的未匹配元素)。
    • 如果 nums1[i] > nums2[indexs[left]]:说明 nums1[i] 可以战胜 nums2 中当前最小的对手。这是一个优势匹配。我们将 nums1[i] 分配给 nums2 中这个最小对手的原始位置,即 ret[indexs[left]] = nums1[i]。然后移动 left 指针 (left++),考虑 nums2 中下一个最小的对手。
    • 如果 nums1[i] <= nums2[indexs[left]]:说明 nums1[i]nums2 中当前最小的对手都无法战胜。根据贪心策略,这个 nums1[i] 应该去对付 nums2 中最强的对手(反正也打不过,不如消耗掉对方最强的),以保留 nums1 中更强的元素。我们将 nums1[i] 分配给 nums2 中当前最大对手的原始位置,即 ret[indexs[right]] = nums1[i]。然后移动 right 指针 (right--),考虑 nums2 中下一个最大的对手。
    • 无论哪种情况,nums1[i] 都已经被使用,所以移动 i 指针 (i++) 处理 nums1 中的下一个元素。
  4. 循环继续:重复步骤 3,直到 left > right,此时所有 nums1 中的元素都已分配完毕。
  5. 返回结果数组 ret

复杂度分析

  • 时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN)。主要是排序 nums1indexs 数组所需的时间。双指针遍历过程是 O ( N ) O(N) O(N) 的。
  • 空间复杂度: O ( N ) O(N) O(N)。需要额外的空间存储 indexs 数组和结果数组 ret

Code

class Solution {public int[] advantageCount(int[] nums1, int[] nums2) {int n = nums2.length;Integer[] indexs = new Integer[n];for (int i = 0; i < n; i++) {indexs[i] = i;}Arrays.sort(nums1);Arrays.sort(indexs, (a, b) -> (nums2[a] - nums2[b]));int left = 0, right = n - 1;int i = 0;int[] ret = new int[n];while (left <= right) {int index = 0;if (nums1[i] <= nums2[indexs[left]]) {index = indexs[right];right--;} else {index = indexs[left];left++;}ret[index] = nums1[i];i++;}return ret;}
}

3402. 使每一列严格递增的最少操作次数 (Minimum Operations to Make Columns Strictly Increasing)

题目描述

题目截图

解题思路与方法

核心思想:贪心策略

题目要求我们用最少的操作次数使得网格 grid 的每一列都严格递增。对于每一列,我们需要确保 grid[j][i] > grid[j-1][i] 对所有 j > 0 成立。

为了使操作次数最少,当发现 grid[j][i] <= grid[j-1][i] 时,我们应该将 grid[j][i] 增加到刚好满足严格递增条件的最小值,即 grid[j-1][i] + 1

具体步骤:

  1. 初始化总操作次数 ret = 0
  2. 遍历每一列:外层循环遍历列索引 i0grid[0].length - 1
  3. 遍历每一行的元素(从第二行开始):内层循环遍历行索引 j1grid.length - 1
  4. 检查条件:在每一列内部,比较当前元素 grid[j][i] 和它正上方的元素 grid[j-1][i]
  5. 执行操作
    • 如果 grid[j][i] <= grid[j-1][i],说明不满足严格递增条件。
    • 计算需要增加的值:increase = (grid[j-1][i] + 1) - grid[j][i]
    • 将这个增加的值累加到总操作次数 ret 中。
    • 关键:更新 grid[j][i] 的值grid[j-1][i] + 1。这一步非常重要,因为下一行的元素 grid[j+1][i] 需要和 更新后grid[j][i] 进行比较。
  6. 遍历完所有列和行后,ret 就是所需的最小总操作次数。
  7. 返回 ret

复杂度分析

  • 时间复杂度: O ( R × C ) O(R \times C) O(R×C),其中 R 是网格的行数,C 是网格的列数。我们需要遍历网格中的每个元素一次(除了第一行)。
  • 空间复杂度: O ( 1 ) O(1) O(1)。我们是在原地修改 grid(虽然题目可能没要求必须原地修改,但这样做不影响结果且节省空间),只需要常数级别的额外空间存储变量 retij 等。

Code

class Solution {public int minimumOperations(int[][] grid) {int ret = 0;for (int i = 0; i < grid[0].length; i++) {for (int j = 1; j < grid.length; j++) {if (grid[j][i] <= grid[j - 1][i]) {ret += (grid[j - 1][i] + 1 - grid[j][i]);grid[j][i] = grid[j - 1][i] + 1;}}}return ret;}
}

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

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

相关文章

【MySQL】增删改查(CRUD)

目录 一. CRUD是什么 二. Create&#xff08;新增数据&#xff09; 2.1 单行数据全列插入 2.2 单行数据指定列插入 2.3 多行数据指定列插入 三. Retrieve &#xff08;检索/查询&#xff09; 3.1 全列查询 3.2 指定列查询 3.3 查询字段为表达式 3.4 为查询结果指定别名 3…

电商平台 API 开发实战:京东商品详情数据实时获取接口对接教程

在电商行业竞争日益激烈的当下&#xff0c;实时获取商品详情数据对于市场分析、竞品监控、商品推荐等业务场景至关重要。京东作为国内领先的电商平台&#xff0c;提供了强大的 API 接口&#xff0c;允许开发者获取丰富的商品信息。本文将详细介绍京东商品详情数据实时获取接口的…

YOLO视觉模型可视化训练与推理测试工具

推荐一款YOLO可视化训练测试工具: 对于yolo的训练,新手小白往往无从下手,本章推荐的这款工具可以非常轻易的帮您从模型训练到测试到部署。 下载地址http://www.voouer.com/yolo 可以点击此处跳转。 下载成功后打开这款工具,将会出现图形化界面,类似于下图所示: 当前页是可视…

微调 LLaMA 2:定制大型语言模型的分步指南

微调 LLaMA 2&#xff1a;定制大型语言模型的分步指南 深入了解如何运用新技术在 Google Colab 平台上对 Llama-2 进行微调操作&#xff0c;从而有效克服内存与计算方面的限制&#xff0c;让开源大型语言模型变得更加易于获取和使用。自从 Meta 发布了 LLaMA 的首个版本后&…

探秘明远智睿SSD2351开发板在HMI领域的独特魅力

人机界面&#xff08;HMI&#xff09;是人与机器进行交互的重要桥梁&#xff0c;其性能和用户体验直接影响到整个系统的使用效果。明远智睿的SSD2351开发板凭借其出色的性能和丰富的功能&#xff0c;在HMI领域展现出了独特的魅力。 SSD2351开发板的四核1.4GHz处理器具备强大的图…

Keysight万用表使用指南及基于Python采集数据生成Excel文件

文章目录 说明使用的库openpyxlpyvisa 代码说明效果展示参考代码 说明 本文介绍了 Keysight 34465A 的基本使用和 SCPI 指令设置&#xff0c;演示了使用 Python 的 PyVISA 库控制两台 34465A 同时采集数据的完整流程&#xff0c;包括设置采样参数、触发测量、读取数据、使用 O…

Docker 获取 Python 镜像操作指南

1. 安装 Docker 环境 1.1 上传安装脚本&#xff08;Windows → Linux&#xff09; 在 Windows 的 CMD 中执行&#xff1a; scp docker.sh root10.1.1.58:~ 可自行前往我的飞书下载docker.sh脚本 Docs 1.2 在 Linux 中检查文件 ls -l ~ # 确认 docker.sh 已上传到家目录…

JavaScript:从JS的执行机制到location对象

一、JS执行机制 &#xff08;1&#xff09;JS是单线程 JavaScript语言的一大特点就是单线程&#xff0c;也就是同一时间只能做一件事。因为JavaScript是为了处理页面中的用户交互&#xff0c;以及制作DOM二诞生的。比如我们对某个DOM元素进行添加和删除操作&#xff0c;这个不…

iVX:数字化转型全场景技术革新与生态构建实践

在数字经济蓬勃发展的当下&#xff0c;企业数字化转型需求日益迫切。iVX 凭借其独特的技术架构与创新解决方案&#xff0c;深度渗透工业互联网、元宇宙、智慧城市等领域&#xff0c;成为推动全场景数字化转型的重要力量。本文将重新梳理 iVX 的技术应用与生态价值&#xff0c;以…

生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向

信息传递中的“击鼓传花” 新特性的突现 功能柱&#xff1a;简化节点 高级视皮层中的信息走向

StarRocks Lakehouse 如何重构大数据架构?

随着数据分析需求的不断演进&#xff0c;企业对数据处理架构的期望也在不断提升。在这一背景下&#xff0c;StarRocks 凭借其高性能的实时分析能力&#xff0c;正引领数据分析进入湖仓一体的新时代。 4 月 18 日&#xff0c;镜舟科技高级技术专家单菁茹做客开源中国直播栏目《…

【SpringBoot】基于mybatisPlus的博客系统

1.实现用户登录 在之前的项目登录中&#xff0c;我使用的是Session传递用户信息实现校验登录 现在学习了Jwt令牌技术后我尝试用Jwt来完成校验工作 Jwt令牌 令牌一词在网络编程一节我就有所耳闻&#xff0c;现在又拾了起来。 这里讲应用&#xff1a;令牌也就用于身份标识&a…

HCIP-security常见名词

缩略语英文全称解释3DESTriple Data Encryption Standard三重数据加密标准AESAdvanced Encryption Standard高级加密标准AHAuthentication Header报文认证头协议CACertification Authority证书颁发中心DESData Encryption Standard数据加密标准DHDiffie-Hellman密钥交换算法DPD…

合并多个Excel文件到一个文件,并保留格式

合并多个Excel文件到一个文件&#xff0c;并保留格式 需求介绍第一步&#xff1a;创建目标文件第二步&#xff1a;创建任务列表第三步&#xff1a;合并文件第四步&#xff1a;处理合并后的文件之调用程序打开并保存一次之前生成的Excel文件第五步&#xff1a;处理合并后的文件之…

TDengine 中的压缩设计

简介 机器设备产生的时序数据量大&#xff0c;直接存储成本非常高&#xff0c;所以需要使用压缩技术&#xff0c;尽可能减小体积。 TDengine 使用了列式存储&#xff0c;结合二级压缩技术&#xff0c;压缩率通常可以达到 20%&#xff0c;特殊情况下更能达到 5 % 以内&#xff…

深度学习涉及的数学与计算机知识总结

深度学习涉及的数学与计算机知识可总结为以下核心模块&#xff0c;结合理论与实践需求分为数学基础和计算机技能两大方向&#xff1a; 一、数学知识 线性代数 核心&#xff1a;矩阵运算&#xff08;乘法、转置、逆矩阵&#xff09;、向量空间、特征值与特征向量、奇异值分解&am…

javascript<——>进阶

一、作用域&#xff1a;变量可以被访问的范围 1.局部作用域 1.1函数作用域 在函数内部声明的变量&#xff0c;在函数内部被访问的&#xff0c;外部无法直接访问。 总结&#xff1a;1、函数内部声明的变量&#xff0c;在函数外部无法直接访问 2、函数的参数也是函数内部的局…

驱动开发硬核特训 · Day 25 (附加篇):从设备树到驱动——深入理解Linux时钟子系统的实战链路

一、前言 在嵌入式Linux开发中&#xff0c;无论是CPU、外设控制器&#xff0c;还是简单的GPIO扩展器&#xff0c;大多数硬件模块都离不开时钟信号的支撑。 时钟子系统&#xff08;Clock Subsystem&#xff09;&#xff0c;作为Linux内核中基础设施的一部分&#xff0c;为设备…

并发设计模式实战系列(7):Thread Local Storage (TLS)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第七章Thread Local Storage (TLS)&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. TLS内存模型 2. 关键特性 二、生活化类比&a…

时序数据库 TDengine × Perspective:你需要的可视化“加速器”

你有没有遇到这样的场景&#xff1a;数据已经写进数据库&#xff0c;图表却总是“慢半拍”&#xff1f;或是操作界面太卡&#xff0c;光是一个排序就能让你等到喝完一杯咖啡&#xff1f;当数据量越来越大、响应时间却越来越长&#xff0c;开发者和用户都不禁要问一句——就没有…