每日算法-250425

每日算法打卡 - 2025年4月25日

记录今天完成的几道 LeetCode 算法题,分享解题思路和代码。


2178. 拆分成最多数目的正偶数之和

题目
题目截图 2178

解题思路

贪心算法

解题过程

题目要求我们将一个偶数 finalSum 拆分成尽可能多的 不同 正偶数之和。

为了使拆分出的数字数量最多,我们应该尽可能选择小的偶数。因此,可以采用贪心策略:从最小的正偶数 2 开始,依次尝试添加 4, 6, 8, …,并不断更新剩余的 finalSum

具体步骤如下:

  1. 初始化一个空列表 ret 用于存放结果。
  2. 首先判断 finalSum 是否为偶数,如果不是,无法拆分,直接返回空列表。
  3. 使用一个变量 i 从 2 开始,表示当前尝试添加的偶数。
  4. 进入循环,只要 finalSum 大于 0:
    a. 尝试从 finalSum 中减去当前的偶数 i
    b. 关键一步:检查减去 i 后的 finalSum。如果 finalSum <= i,这意味着剩余的 finalSum 不足以让我们在下一步添加 i+2(因为需要不同的偶数,且 i+2 > i >= finalSum),或者刚好等于 i(如果加上 i 会导致重复)。为了用尽 finalSum 并保证得到最多数量的偶数,我们将这个剩余的 finalSum 加到当前的 i 上,形成 i + finalSum_remaining。这个合并后的值将是最后一个加入列表的数。然后将 finalSum 设为 0,表示总和已完全分配。
    c. 将(可能被调整过的)i 添加到结果列表 ret 中。
    d. 将 i 增加 2,准备处理下一个偶数。
  5. finalSum 变为 0 时,循环结束,返回列表 ret

这种方法确保了每次都取最小的可用偶数,从而最大化了偶数的数量,并且通过最后一步的合并操作保证了所有数都是不同的正偶数且总和恰好为 finalSum

复杂度分析

  • 时间复杂度: O ( f i n a l S u m ) O(\sqrt{finalSum}) O(finalSum )。 我们依次添加 2, 4, 6, …, k。这些数的和大约是 k 2 / 2 k^2 / 2 k2/2。当和达到 finalSum 时停止,所以 k 2 ≈ 2 × f i n a l S u m k^2 \approx 2 \times finalSum k22×finalSum, 即 k ≈ 2 × f i n a l S u m k \approx \sqrt{2 \times finalSum} k2×finalSum 。循环的次数与 k k k 成正比,因此时间复杂度为 O ( f i n a l S u m ) O(\sqrt{finalSum}) O(finalSum )
  • 空间复杂度: O ( f i n a l S u m ) O(\sqrt{finalSum}) O(finalSum )。 结果列表 ret 最多存储约 f i n a l S u m \sqrt{finalSum} finalSum 个数。

Code

class Solution {public List<Long> maximumEvenSplit(long finalSum) {List<Long> ret = new ArrayList<>();if (finalSum % 2 != 0) {return ret;}long i = 2;while (finalSum > 0) {finalSum -= i;if (finalSum <= i) {i += finalSum;finalSum = 0;}ret.add(i);i += 2;}return ret;}
}

2567. 修改两个元素的最小分数

题目
题目截图 2567

解题思路

贪心

解题过程

题目要求我们通过修改数组中的两个元素,使得数组的“分数”(最大值与最小值的差)最小。我们有两次修改机会。

为了最小化最大值与最小值的差,最优的修改策略总是将待修改的元素值改为与数组中某个“目标”元素相等。由于我们可以修改两个数,我们可以考虑以下几种情况来消除极端值对分数的影响:

  1. 修改两个最大值: 将数组中最大的两个元素修改成与最小值 nums[0] 相等(或者修改成任何小于等于 nums[n-3] 的值)。修改后,数组的实际最大值为 nums[n-3],最小值为 nums[0]。分数是 nums[n-3] - nums[0]
  2. 修改两个最小值: 将数组中最小的两个元素修改成与最大值 nums[n-1] 相等(或者修改成任何大于等于 nums[2] 的值)。修改后,数组的实际最小值为 nums[2],最大值为 nums[n-1]。分数是 nums[n-1] - nums[2]
  3. 修改一个最大值和一个最小值: 将最小值 nums[0] 修改成 nums[1](或更大),并将最大值 nums[n-1] 修改成 nums[n-2](或更小)。修改后,数组的实际最小值为 nums[1],最大值为 nums[n-2]。分数是 nums[n-2] - nums[1]

这三种情况涵盖了通过两次修改来最小化 max - min 的所有有效策略。因为我们总是希望消除最大的数或最小的数对分数的影响。

因此,我们首先对数组进行排序,然后计算上述三种情况对应的分数,取其中的最小值即为答案。

复杂度分析

  • 时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN),主要是数组排序所需的时间。
  • 空间复杂度: O ( log ⁡ N ) O(\log N) O(logN) O ( 1 ) O(1) O(1),取决于排序算法使用的额外空间。

Code

class Solution {public int minimizeSum(int[] nums) {Arrays.sort(nums);int n = nums.length;int maxToMin = nums[n - 3] - nums[0];int minToMax = nums[n - 1] - nums[2];int maxToMinANDminToMax = nums[n - 2] - nums[1];return Math.min(maxToMinANDminToMax, Math.min(maxToMin, minToMax));}
}

1509. 三次操作后最大值与最小值的最小差

题目
题目截图 1509

解题思路

贪心

解题过程

这道题与上一题类似,但我们有三次修改机会。目标仍然是最小化修改后数组的最大值与最小值的差。

同样,最优策略是修改数组中的极端值(最大或最小的那些)。有三次修改机会,意味着我们可以“消除”数组排序后两端的最多三个元素对最终 max - min 差值的影响。考虑以下四种消除极端值的情况:

  1. 修改最大的三个数: 将 nums[n-1], nums[n-2], nums[n-3] 修改掉。剩下的元素范围是 [nums[0], nums[n-4]]。最小差值为 nums[n-4] - nums[0]
  2. 修改最小的三个数: 将 nums[0], nums[1], nums[2] 修改掉。剩下的元素范围是 [nums[3], nums[n-1]]。最小差值为 nums[n-1] - nums[3]
  3. 修改最小的两个数和最大的一个数: 将 nums[0], nums[1]nums[n-1] 修改掉。剩下的元素范围是 [nums[2], nums[n-2]]。最小差值为 nums[n-2] - nums[2]
  4. 修改最小的一个数和最大的两个数: 将 nums[0], nums[n-1]nums[n-2] 修改掉。剩下的元素范围是 [nums[1], nums[n-3]]。最小差值为 nums[n-3] - nums[1]

这四种情况覆盖了所有最优的可能。因为要最小化差值,我们总是改变最大或最小端的元素。改变中间的元素不会比改变两端的元素更优。

所以,先对数组排序。如果数组长度 n 小于或等于 4,我们总能通过三次修改使得所有元素相等,差值为 0。否则,计算上述四种情况的差值,返回其中的最小值。

复杂度分析

  • 时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN), 瓶颈在于排序。
  • 空间复杂度: O ( log ⁡ N ) O(\log N) O(logN) O ( 1 ) O(1) O(1), 取决于排序算法。

Code

class Solution {public int minDifference(int[] nums) {int n = nums.length;if (n <= 4) {return 0;}Arrays.sort(nums);int maxToMin = nums[n - 4] - nums[0];int minToMax = nums[n - 1] - nums[3];int firstTwo = nums[n - 2] - nums[2];int lastTwo = nums[n - 3] - nums[1];int one = Math.min(maxToMin, minToMax);int two = Math.min(firstTwo, lastTwo);return Math.min(one, two);}
}

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

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

相关文章

SQL进阶知识:四、索引优化

今天介绍下关于索引优化的详细介绍&#xff0c;并结合MySQL数据库提供实际例子。 索引优化是数据库性能优化的关键环节之一&#xff0c;尤其是在处理大量数据时。索引可以加快查询速度&#xff0c;减少数据扫描范围&#xff0c;但不当的索引设计也可能导致性能问题。以下是关于…

(PYTHON)函数

函数的基本概念&#xff1a; python中函数分为以下四种&#xff1a; 1&#xff0c;python内置函数&#xff1a;如abs&#xff0c;len&#xff0c;max&#xff0c;min&#xff1b; 2&#xff0c;标准库函数&#xff1a;通过import声明标准库&#xff0c;如&#xff1a;math&a…

Winform(1.Winform控件学习)

使用的控件有:Button,Label,TextBox button:表示一个按钮,用户点击按钮触发事件 click事件最常用 label:标签,用于显示文本 Name属性:变量名称 textBox:输入框 Form1代码: using System; using System.Collections.Generic; using System.ComponentModel; using Sys…

linux centOS7.9 No package docker-ce available

docker pull apache/apisix:3.2.2-centos Error response from daemon: missing signature key 处理方式如下&#xff1a; 问题&#xff1a;在纯净机里安装docker时报错No package docker-ce available。 解决办法&#xff1a; 1、更新yum&#xff0c;使用yum -y upgrade&#…

小白学习java第15天:JDBC

1.数据库驱动 想一下我们之前是怎么操作数据库&#xff0c;是不是使用SQL语句对其mysql数据库管理系统&#xff0c;然后管理系统在进行数据库&#xff08;硬盘文件里面的&#xff09;进行操作。那么我现在想使用应用程序对其数据库进行操作&#xff0c;应该怎么办呢&#xff1…

django之数据的翻页和搜索功能

数据的翻页和搜素功能 目录 1.实现搜素功能 2.实现翻页功能 一、实现搜素功能 我们到bootstrap官网, 点击组件, 然后找到输入框组, 并点击作为额外元素的按钮。 我们需要使用上面红色框里面的组件, 就是搜素组件, 代码部分就是下面红色框框出来的部分。 把这里的代码复制…

Kotlin Multiplatform--02:项目结构进阶

Kotlin Multiplatform--02&#xff1a;项目结构进阶 引言正文 引言 在上一章中&#xff0c;我们对 Kotlin Multiplatform 项目有了基本的了解&#xff0c;已经可以进行开发了。但我们只是使用了系统默认的项目结构。本章介绍了如何进行更复杂的项目结构管理。 正文 在上一章中&…

【Git】连接github时的疑难杂症(DNS解析失败)

大家好&#xff0c;我是jstart千语。最近在将项目推送到github的时候&#xff0c;突然github就拒绝访问了&#xff0c;即使挂了VPN&#xff0c;网页也进不去&#xff0c;通过git也不能把代码推送上去。 即使后面看别人的一些解决方案&#xff0c;比如取消代理啊、更换ssh的方式…

ViTMAE:掩码自编码器是可扩展的视觉学习者

摘要 本文展示了掩码自编码器&#xff08;MAE&#xff09;作为计算机视觉中的可扩展自监督学习方法。我们的MAE方法很简单&#xff1a;我们对输入图像进行随机掩码&#xff0c;并重建缺失的像素。该方法基于两个核心设计。首先&#xff0c;我们开发了一种非对称的编码器-解码器…

全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)

一、行业全景&#xff1a;从“材料突破”到“能源革命”的核心引擎 碳化硅&#xff08;SiC&#xff09;作为第三代半导体材料的代表&#xff0c;凭借其宽禁带&#xff08;3.26eV&#xff09;、高临界击穿场强&#xff08;3MV/cm&#xff09;、高热导率&#xff08;4.9W/cmK&…

AWS Glue ETL设计与调度最佳实践

一、引言 在AWS Glue中设计和调度ETL过程时&#xff0c;需结合其无服务器架构和托管服务特性&#xff0c;采用系统化方法和最佳实践&#xff0c;以提高效率、可靠性和可维护性。本文将从调度策略和设计方法两大维度详细论述&#xff0c;并辅以实际案例说明。 二、调度策略的最…

数据结构手撕--【二叉树】

目录 定义结构体&#xff1a; 初始化&#xff1a; 手动创建一个二叉树&#xff1a; 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历 二叉树节点个数&#xff1a; 叶子节点个数&#xff1a; 二叉树第k层节点个数&#xff1a; 二叉树的高度&#xff1a; 查找值为x…

2025 Java 开发避坑指南:如何避免踩依赖管理的坑?

在 Java 开发的世界里&#xff0c;依赖管理就像是一座看不见的桥梁&#xff0c;连接着项目所需的各种第三方库和框架。然而&#xff0c;这座桥梁并非总是稳固&#xff0c;稍有不慎就可能掉入 “依赖地狱”&#xff0c;导致项目编译失败、运行异常。2025 年&#xff0c;随着开源…

用node打开一个网页

前言 使用node打开网页&#xff0c;要求跨平台 方案 使用子进程来用命令行打开网页链接就可以了&#xff0c;需要注意的是Mac系统使用的是open命令&#xff0c;Windows系统使用的是start命令&#xff0c;Linux等系统使用xdg-open命令。针对不同的操作系统使用不同的命令。 封…

使用功能包组织C++节点的具体教程

在 ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;使用功能包&#xff08;package&#xff09;来组织 C 节点是一种常见且有效的方式&#xff0c;它能让代码结构更清晰、便于管理和复用。 1. 环境准备 确保已经安装了 ROS&#xff0c;这里以 ROS 2 Humble…

二项式分布html实验

二项式分布html实验 本文将带你一步步搭建一个纯前端的二项分布 Monte-Carlo 模拟器。 只要一个 HTML 文件&#xff0c;打开就能运行&#xff1a; 动态输入试验次数 n、成功概率 p 与重复次数 m点击按钮立刻得到「模拟频数 vs 理论频数」柱状图随着 m 增大&#xff0c;两组柱状…

通过 API 对接应用网络商城实现订单自动化

前言 API&#xff08;Application Programming Interface&#xff09;即应用程序编程接口&#xff0c;是一种允许不同软件应用程序之间进行交互和数据共享的工具。它通过定义一组明确的规则和协议&#xff0c;使得各个软件系统能够以标准化的方式相互通信。 在支付领域&#x…

openwrt作旁路由时的几个常见问题 openwrt作为旁路由配置zerotier 图文讲解

1 先看openwrt时间&#xff0c;一定要保证时间和浏览器和服务器是一致的&#xff0c;不然无法更新 2 openwrt设置旁路由前先测试下&#xff0c;路由器能否ping通主路由&#xff0c;是否能够连接外网&#xff0c;好多旁路由设置完了&#xff0c;发现还不能远程好多就是旁路由本…

FANUC机器人GI与GO位置数据传输设置

FANUC机器人GI与GO位置数据传输设置&#xff08;整数小数分开发&#xff09; 一、概述 在 Fanuc 机器人应用中&#xff0c;如果 IO 点位足够&#xff0c;可以利用机器人 IO 传输位置数据及偏移位置数据等。 二、操作步骤 1、确认通讯软件安装 首先确认机器人控制柜已经安装…

UE5 Assimp 自用

记录一下配assimp库到ue中的过程。因为想在ue里面实现一些几何处理(虽然ue好像有相关的geo的代码&#xff09;&#xff0c;遂配置了一下assimp。 1. 编译整理生成自己所需要的文件。cmake编译&#xff0c;下载github 的官方的assimp-master&#xff0c;然后cmake都是默认的就行…