每日算法-250502

每日算法 - 2025.05.02

记录一下今天刷的几道 LeetCode 算法题。


3191. 使二进制数组全部等于 1 的最少操作次数 I

题目

Problem 3191 Description

思路

贪心

解题过程

遍历数组 nums。当我们遇到 nums[i] 时:

  1. 如果 nums[i] 是 1,我们不需要进行操作,因为目标是全 1,并且之前的元素 [0, i-1] 已经被处理为 1(基于贪心策略)。
  2. 如果 nums[i] 是 0,我们 必须 在此时进行翻转操作。因为这是唯一一次可以影响 nums[i] 的操作(操作窗口是 [i, i+1, i+2])。任何后续的操作都无法再将 nums[i] 从 0 变为 1。因此,我们翻转 nums[i], nums[i+1], nums[i+2],并增加操作计数。

我们只遍历到 n-3,因为操作需要三个连续的元素。当循环结束后,我们需要检查最后两个元素 nums[n-2]nums[n-1]。由于我们无法再对它们执行翻转操作(没有足够的后续元素形成长度为 3 的窗口),它们必须已经是 1。如果其中任何一个是 0,则无法完成目标,返回 -1。否则,返回累计的操作次数。

复杂度

  • 时间复杂度: O(N),其中 N 是数组的长度,我们只需要遍历数组一次。
  • 空间复杂度: O(1),我们只使用了常数级别的额外空间。

Code

class Solution {public int minOperations(int[] nums) {int n = nums.length;int ret = 0;for (int i = 0; i <= n - 3; i++) {if (nums[i] == 0) {nums[i] = 1;nums[i + 1] = 1 - nums[i + 1];nums[i + 2] = 1 - nums[i + 2];ret++;}}if (nums[n - 2] == 0 || nums[n - 1] == 0) {return -1;}return ret;}
}

1827. 最少操作使数组递增

题目

Problem 1827 Description

思路

贪心

解题过程

我们要使数组严格递增,并且操作次数最少。我们可以从左到右遍历数组,比较相邻的两个元素 nums[i]nums[i+1]

  1. 如果 nums[i] < nums[i+1],数组在 ii+1 之间已经是严格递增的,我们不需要做任何操作。
  2. 如果 nums[i] >= nums[i+1],为了满足严格递增的要求,nums[i+1] 必须至少增加到 nums[i] + 1。为了使操作次数最少,我们选择将其恰好增加到 nums[i] + 1。增加的操作次数是 (nums[i] + 1) - nums[i+1]。同时,我们需要更新 nums[i+1] 的值为 nums[i] + 1,以便后续的比较基于更新后的值。

累加所有操作次数即可。

复杂度

  • 时间复杂度: O(N),其中 N 是数组的长度,我们只需要遍历数组一次。
  • 空间复杂度: O(1),我们是在原地修改数组(或者可以只用一个变量记录前一个元素的值),只使用了常数级别的额外空间。

Code

class Solution {public int minOperations(int[] nums) {int n = nums.length;int ret = 0;for (int i = 0; i < n - 1; i++) {if (nums[i] >= nums[i + 1]) {ret += nums[i] + 1 - nums[i + 1];nums[i + 1] = nums[i] + 1;}}return ret;}
}

2027. 转换字符串的最少操作次数

题目

Problem 2027 Description

思路

贪心

解题过程

我们需要将字符串中的所有 ‘X’ 转换成 ‘O’,每次操作可以连续转换 3 个字符。目标是使用最少的操作次数。

我们可以从左到右遍历字符串 s

  1. 如果当前字符 s[i] 是 ‘O’,它已经满足条件,我们不需要操作,直接看下一个字符 s[i+1]
  2. 如果当前字符 s[i] 是 ‘X’,我们必须执行一次操作来转换它。根据贪心策略,这次操作应该尽可能地覆盖更多的 ‘X’。由于操作固定影响 s[i], s[i+1], s[i+2] 这三个字符,我们执行一次操作,将这三个字符(无论它们原来是 ‘X’ 还是 ‘O’)都视为已处理(逻辑上变成 ‘O’),然后将索引 i 直接增加 3(即跳过 i+1i+2),因为这三个位置都已经被这次操作覆盖了。操作次数加 1。

遍历结束后,累计的操作次数就是最少次数。

复杂度

  • 时间复杂度: O(N),其中 N 是字符串的长度。虽然我们可能会跳过字符 (i += 2),但每个字符最多被访问一次。
  • 空间复杂度: O(N)(如果使用 toCharArray())或 O(1)(如果直接操作字符串索引)。Java 中字符串是不可变的,toCharArray() 会创建字符数组副本,空间复杂度为 O(N)。如果语言支持原地修改或仅通过索引访问,则可以是 O(1)

Code

class Solution {public int minimumMoves(String ss) {char[] s = ss.toCharArray();int n = s.length;int ret = 0;for (int i = 0; i < n; /* i 在循环内部更新 */) {// 如果当前字符是 'X'if (s[i] == 'X') {// 需要一次操作ret++;// 这次操作覆盖了 i, i+1, i+2,所以下次从 i+3 开始检查i += 3; } else {// 如果当前字符是 'O',直接检查下一个字符i++;}}return ret;}
}

注意:原代码中 i += 2; 配合 for 循环的 i++ 实际上是 i += 3 的效果,这里修改为在 if 块内直接 i += 3else 块内 i++,更清晰地表达了逻辑。


3397. 执行操作后不同元素的最大数量 (复习)

题目

Problem 3397 Description

这是第二次做这道题了,已经算是掌握了。核心思想是贪心地调整每个数的值,以最大化不同元素的数量。

详细题解见之前的博客:每日算法-250427,里面还有点小优化。

Code

class Solution {public int maxDistinctElements(int[] nums, int k) {Arrays.sort(nums);int ret = 1;nums[nums.length - 1] += k;for (int i = nums.length - 2; i >= 0; i--) {nums[i] = Math.max(Math.min(nums[i] + k, nums[i + 1] - 1), nums[i] - k);if (nums[i] < nums[i + 1]) {ret++;}}return ret;}
}

2476. 二叉搜索树最近节点查询 (复习)

题目

Problem 2476 Description

这道题也是复习,核心思路已经掌握。主要步骤是:

  1. 通过 中序遍历 将二叉搜索树(BST)转换为一个 有序数组
  2. 对于每个查询值 k,在有序数组中使用 二分查找 来找到 min_i (小于等于 k 的最大值) 和 max_i (大于等于 k 的最小值)。

二分查找细节:
通常使用二分查找找到第一个大于等于 k 的元素的索引 idx

  • max_i 就是 nums[idx](如果 idx 没越界)。如果 idx 越界,说明 k 比所有元素都大,max_i 为 -1。
  • min_i
    • 如果 nums[idx] == k,则 min_i = k
    • 如果 nums[idx] > k,则 min_iidx 前一个元素 nums[idx-1](如果 idx > 0)。如果 idx == 0,说明 k 比所有元素都小,min_i 为 -1。
    • 如果 idx 越界(即 k 比所有元素都大),min_i 是数组最后一个元素 nums[n-1]

详细题解见之前的博客:每日算法-250413

Code

class Solution {public List<List<Integer>> closestNodes(TreeNode root, List<Integer> queries) {List<Integer> arr = new ArrayList<>();rootToList(root, arr);int len = arr.size();int[] nums = new int[len];ListToArray(nums, arr);int n = queries.size();int min = 0, max = 0;List<List<Integer>> ret = new ArrayList<>(n);for (int i = 0; i < n; i++) {List<Integer> tmp = new ArrayList<>();int k = queries.get(i);int index = search(nums, k);if (index >= len) {max = -1;min = nums[len - 1];} else {min = index == 0 ? -1 : nums[index - 1];if (nums[index] == k) {min = nums[index];}max = nums[index];}tmp.add(min);tmp.add(max);ret.add(tmp);}return ret;}private void rootToList(TreeNode root, List<Integer> arr) {if (root == null) {return;}rootToList(root.left, arr);arr.add(root.val);rootToList(root.right, arr);}private void ListToArray(int[] nums, List<Integer> arr) {for (int i = 0; i < nums.length; i++) {nums[i] = arr.get(i);}}private int search(int[] nums, int k) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < k) {left = mid + 1;} else {right = mid - 1;}}return left;}
}

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

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

相关文章

移动端开发中设备、分辨率、浏览器兼容性问题

以下是针对移动端开发中设备、分辨率、浏览器兼容性问题的 系统化解决方案&#xff0c;按开发流程和技术维度拆解&#xff0c;形成可落地的执行步骤&#xff1a; 一、基础环境适配&#xff1a;从「起点」杜绝兼容性隐患 1. Viewport 元标签标准化 <meta name"viewpor…

2025最新AI绘画系统源码 - 画图大模型/GPT-4全支持/AI换脸/自定义智能体

在AI绘画技术日新月异的2025年&#xff0c;比象AI绘画系统源码以其突破性的技术创新重新定义了数字艺术创作的边界。作为第四代AI绘画引擎&#xff0c;我们不仅集成了最先进的GPT-4o多模态画图模型&#xff0c;实现了从基础文生图到专业级艺术创作的全面进化。本系统源码经过多…

构造函数详解

构造函数的作用 构造函数的主要任务是初始化对象&#xff0c;而不是创建对象&#xff08;对象的内存空间在构造函数被调用前已经分配好&#xff09;。 构造函数特性 命名规则&#xff1a;函数名必须与类名完全相同。 返回值&#xff1a;构造函数没有返回值类型&#xff08;连…

jaffree 封装ffmpeg 转换视频格式,获取大小,时间,封面

下载 参考网址 【收藏级教程】FFmpeg音视频处理宝典&#xff1a;从入门到精通的50个实用技巧_ffmpeg教程-CSDN博客 配置环境变量 验证 重启idea开发工具 springboot maven集成 <dependency><groupId>com.github.kokorin.jaffree</groupId><artifactId&…

2505C++,wmi客户端示例

原文 #define _WIN32_DCOM #include <iostream> using namespace std; #include <comdef.h> #include <Wbemidl.h> #pragma comment(lib, "wbemuuid.lib") int main(int argc, char **argv) {HRESULT hres;//初化COM.hres CoInitializeEx(0, CO…

[面试]SoC验证工程师面试常见问题(三)

SoC验证工程师面试常见问题(三) 在 SoC 验证工程师的面试中,面试官可能会要求候选人现场编写 SystemVerilog、UVM (Universal Verification Methodology) 或 SystemC 代码,以评估其编程能力、语言掌握程度以及解决实际验证问题的能力。这种随机抽题写代码的环节通常…

HTML5+JavaScript实现连连看游戏之二

HTML5JavaScript实现连连看游戏之二 以前一篇&#xff0c;见 https://blog.csdn.net/cnds123/article/details/144220548 连连看游戏连接规则&#xff1a; 只能连接相同图案&#xff08;或图标、字符&#xff09;的方块。 连线路径必须是由直线段组成的&#xff0c;最多可以有…

《深入浅出Git:从版本控制原理到高效协作实战》​

Git的原理和使用 1、Git初识与安装2、Git基本操作2.1、创建Git本地仓库2.2、配置Git2.3、认识工作区、暂存区、版本库2.4、修改文件2.5、版本回退2.6、撤销修改2.7、删除文件 3、Git分支管理3.1、理解分支3.2、创建、切换、合并分支3.3、删除分支3.4、合并冲突3.5、合并模式3.6…

数据分析_问题/优化

1 报表开发 1.1 数据问题 (1) 数据易错 问题描述 ①数据整合困难:数据来源多样、格式差异大,整合时处理不当易丢错数据. ②计算逻辑复杂:开发人员对复杂计算逻辑的理解产生偏差,会导致计算结果不准. 解决方案 ①建立数据标准,统一修正字段命名、数据类型、日期格式等 ②加强…

“深入剖析ThreadLocal原理:从多线程数据隔离到内存泄漏防范“

1.在没有ThreadLocal遇到的问题&#xff1a; 在多线程编程领域&#xff0c;多个线程同时访问同一个变量时&#xff0c;数据一致性成为关键挑战。为防止修改数据时出现覆盖问题&#xff0c;传统解决方案是采用加锁机制&#xff0c;让线程排队依次访问共享变量。然而&#xff0c…

读懂 Vue3 路由:从入门到实战

在构建现代化单页应用&#xff08;SPA&#xff09;时&#xff0c;Vue3 凭借其简洁高效的特性成为众多开发者的首选。 而 Vue3 路由&#xff08;Vue Router&#xff09;则是 Vue3 生态中不可或缺的一部分&#xff0c;它就像是单页应用的 “导航地图”&#xff0c;帮助用户在不同…

Mac M1安装 Docker Desktop 后启动没反应

Mac M1安装 Docker Desktop 后启动没反应 如果在 Mac M1 上安装 Docker&#xff0c;那最好的选择是安装 Docker Desktop但是今天重新安装 Docker Desktop 后&#xff0c;发现点击图标启动怎么也没反应&#xff0c;经过排查后发现换个版本安装就好了&#xff0c;可能是最新的版…

快速上手c语言

快速上手c语言 快速上手c语言关于学c语言的一些信息杂谈第一个C语言程序通过命令行运行c程序Dev-c5.11Visual Studio系列产品 数据类型变量、常量定义变量的方法变量的命名变量的分类变量的使用变量的作用域和生命周期常量 操作符简单介绍语句选择语句循环语句 数组数组定义数组…

Nginx核心功能及正则表达

目录 一&#xff1a;正向代理 1&#xff1a;编译安装nginx &#xff08;1&#xff09;安装支持软件 &#xff08;2&#xff09;创建运行用户、组和日志目录 &#xff08;3&#xff09;编译安装nginx &#xff08;4&#xff09;添加nginx系统服务 2&#xff1a;配置正向代…

npm命令介绍(Node Package Manager)(Node包管理器)

文章目录 npm命令全解析简介基础命令安装npm&#xff08;npm -v检插版本&#xff09;初始化项目&#xff08;npm init&#xff09;安装依赖包&#xff08;npm install xxx、npm i xxx&#xff09;卸载依赖包&#xff08;npm uninstall xxx 或 npm uni xxx、npm remove xxx&…

【Linux】Linux基础概念

一些比较重要的使用Linux的前情提要。 部分经验来源于网络&#xff0c;若有侵权请联系我删除&#xff0c;主要是做笔记的时候忘记写来源了&#xff0c;做完笔记很久才写博客。 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 Shell命令参数 2 系统变量…

阿里开源Qwen3:大语言模型的新突破

一、模型概览&#xff1a;丰富的模型家族 Qwen3 系列包含了 2 款混合专家&#xff08;MoE&#xff09;模型与 6 款密集&#xff08;Dense&#xff09;模型&#xff0c;参数量覆盖范围极广&#xff0c;从 0.6B 一直延伸至 235B 。其中&#xff0c;旗舰模型 Qwen3 - 235B - A22B…

数字智慧方案5856丨智慧环保综合解决方案(50页PPT)(文末有下载方式)

资料解读&#xff1a;智慧环保综合解决方案 详细资料请看本解读文章的最后内容。 随着城市化进程的加速和环境问题的日益严峻&#xff0c;智慧环保成为提升城市环境管理水平的重要手段。本文将对智慧环保综合解决方案进行详细解读&#xff0c;探讨其在实际应用中的需求、解决…

基于ssm的网盘管理系统(全套)

一、系统架构 前端&#xff1a;vue | element-ui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat | nodejs 二、代码及数据库 三、功能介绍 01. 注册 02. 登录 03. 管理员-首页 04. 管理员-个人中心 …

PostgreSQL 的 VACUUM 与 VACUUM FULL 详解

PostgreSQL 的 VACUUM 与 VACUUM FULL 详解 一、基本概念对比 特性VACUUMVACUUM FULL定义常规维护操作&#xff0c;清理死元组激进重组操作&#xff0c;完全重写表数据锁级别不阻塞读写(共享锁)排他锁(阻塞所有操作)空间回收只标记空间为可用&#xff0c;不返还OS空间返还操作…