LeetCode 2919 使数组变美的最小增量运算数

动态规划解题:最小操作次数使数组变为美丽数组

问题描述

给定一个下标从0开始、长度为n的整数数组nums和一个整数k。你可以对数组中的任意一个元素进行加1操作,操作次数不限。如果数组中任意长度大于或等于3的子数组的最大值都大于或等于k,则称该数组为美丽数组。我们需要找到使数组变为美丽数组所需的最小操作次数。

问题分析

这个问题的核心是如何通过最少的操作次数,使得数组满足特定的条件。具体来说,我们需要确保数组中所有长度大于或等于3的子数组的最大值都大于或等于k。为了实现这一目标,我们可以使用动态规划的方法。

动态规划思路

动态规划是一种将复杂问题分解为子问题的算法思想。在这个问题中,我们可以定义一个数组dp[i],表示将数组nums的前i个元素变成美丽数组所需的最小操作次数。

状态定义
  • dp[i]:表示将数组nums的前i个元素变成美丽数组所需的最小操作次数。

状态转移

对于每个位置i,我们需要考虑以下三种情况:

  1. 只考虑当前元素:即nums[i]单独作为一个子数组的一部分。

  2. 当前元素与前一个元素一起考虑:即nums[i]nums[i-1]作为一个长度为2的子数组的一部分。

  3. 当前元素与前两个元素一起考虑:即nums[i]nums[i-1]nums[i-2]作为一个长度为3的子数组。

为了满足美丽数组的条件,我们需要确保:

  • 如果只考虑当前元素,那么nums[i]必须大于或等于k

  • 如果考虑当前元素与前一个元素,那么nums[i]nums[i-1]中至少有一个必须大于或等于k

  • 如果考虑当前元素与前两个元素,那么nums[i]nums[i-1]nums[i-2]中至少有一个必须大于或等于k

因此,dp[i]的值应该是:

  • 如果nums[i] >= k,则dp[i] = min(dp[i-1], dp[i-2], dp[i-3])

  • 如果nums[i] < k,则dp[i] = min(dp[i-1], dp[i-2], dp[i-3]) + (k - nums[i])

初始化
  • 如果数组长度小于3,直接返回0,因为不存在长度大于或等于3的子数组。

  • 初始化dp[0]dp[1]dp[2]

    • dp[0] = Math.max(0, k - nums[0]):只考虑第一个元素nums[0],如果它小于k,则需要k - nums[0]次操作。

    • dp[1] = Math.max(0, k - nums[1]):只考虑第二个元素nums[1],如果它小于k,则需要k - nums[1]次操作。

    • dp[2] = Math.max(0, k - nums[2]):只考虑第三个元素nums[2],如果它小于k,则需要k - nums[2]次操作。

返回结果

最终返回dp[n-1]dp[n-2]dp[n-3]中的最小值。这是因为最后一个元素可能与前两个元素一起考虑,因此需要选择最小的操作次数。

代码实现

以下是Java代码实现:

class Solution {public long minIncrementOperations(int[] nums, int k) {int n = nums.length;if (n < 3) {return 0; // 如果数组长度小于3,直接返回0}// dp[i]表示将数组nums的前i个元素变成美丽数组所需的最小操作次数long[] dp = new long[n];dp[0] = Math.max(0, k - nums[0]); // 初始化第一个位置dp[1] = Math.max(0, k - nums[1]); // 初始化第二个位置dp[2] = Math.max(0, k - nums[2]); // 初始化第三个位置// 动态规划计算for (int i = 3; i < n; i++) {// 当前位置需要的操作次数long currentCost = Math.max(0, k - nums[i]);// 选择最小的操作次数dp[i] = Math.min(dp[i - 1], Math.min(dp[i - 2], dp[i - 3])) + currentCost;}// 返回最后三个位置的最小值return Math.min(dp[n - 1], Math.min(dp[n - 2], dp[n - 3]));}
}

示例解析

假设nums = [2, 3, 5, 1, 4]k = 4

  1. 初始化

    • dp[0] = Math.max(0, 4 - 2) = 2

    • dp[1] = Math.max(0, 4 - 3) = 1

    • dp[2] = Math.max(0, 4 - 5) = 0

  2. 动态规划计算

    • i = 3

      • currentCost = Math.max(0, 4 - 1) = 3

      • dp[3] = min(dp[2], dp[1], dp[0]) + currentCost = min(0, 1, 2) + 3 = 3

    • i = 4

      • currentCost = Math.max(0, 4 - 4) = 0

      • dp[4] = min(dp[3], dp[2], dp[1]) + currentCost = min(3, 0, 1) + 0 = 0

  3. 返回结果

    • Math.min(dp[4], Math.min(dp[3], dp[2])) = Math.min(0, Math.min(3, 0)) = 0

因此,最终结果是0,表示不需要任何操作即可满足条件。

总结

通过动态规划,我们可以高效地解决这个问题。动态规划的关键在于:

  1. 定义合适的状态dp[i]

  2. 找到状态转移方程。

  3. 初始化边界条件。

  4. 返回最终结果。

希望这篇博客能帮助你更好地理解这个问题的解法!如果你有任何疑问或需要进一步的解释,欢迎留言讨论。

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

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

相关文章

计算生物学在中国的发展情况?

李升伟 整理 计算生物学在中国的发展呈现出多方面积极态势&#xff0c;具体表现如下&#xff1a; 发展概述&#xff1a; 上海发布了医用AI发展的专项方案&#xff0c;特别强调了脑科学与计算生物学的前沿领域。这表明政府有意推动该领域的技术进步和技术合作平台建设。国内的…

Linux之文件内容显示(cat、grep、cut、sort、uniq、tr)

&#x1f3af; 本文专栏&#xff1a;Linux &#x1f680; 作者主页&#xff1a;小度爱学习 1、浏览普通文件内容 命令常用选项说明cat-n 对输出内容中的所有行标注行号&#xff1b;-b 对输出内容中的非空行标注行号。查看文本文件的内容head-num 指定需要显示文件num行的内容。…

3DS 转 STL 全攻略:传统工具与迪威模型网在线转换深度解析

在 3D 建模与 3D 打印的技术领域中&#xff0c;常常会遇到需要将不同格式的文件进行转换的情况。其中&#xff0c;把 3DS 文件转换为 STL 格式是较为常见的操作。3DS 文件作为一种旧版 Autodesk 3D Studio 使用的 3D 图像格式&#xff0c;存储着丰富的信息&#xff0c;包括网格…

IoT FEM射频前端模组芯片(2.4G PA)三伍微电子GSR2401 兼容替代RFX2401

型号&#xff1a;GSR2401应用&#xff1a;适用于蓝牙&#xff08;BT&#xff09;、ZigBee及物联网&#xff08;IoT&#xff09;设备 功能&#xff1a;集成了功率放大器&#xff08;PA&#xff09;、开关&#xff08;Switch&#xff09;和低噪声放大器&#xff08;LNA&#xff…

Missashe考研日记-day22

Missashe考研日记-day22 1 专业课408 学习时间&#xff1a;3h学习内容&#xff1a; 先把昨天关于进程调度的课后习题做了&#xff0c;然后花了挺长时间预习OS的最最最最重要的一部分——同步与互斥问题&#xff0c;这部分大二上课的时候就懵懵懂懂的&#xff0c;得认真再领悟…

2025年最新Web安全(面试题)

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

Qt QML - qmldir使用方法详解

以实际例子看qmldir的使用 1.搞一个qmldir2.让QML找到你的qmldir &#xff08;重点&#xff09;.pro 工程文件QQmlApplicationEngine加载主QML处 3.用起来你的模块 qmldir是Qt QML模块化的基石&#xff0c;其设计初衷是为解决QML文件的组织、复用和依赖管理问题,。只需要在每个…

# Shell脚本参数设计规范(DeepSeek指导)

Shell脚本参数设计规范&#xff08;DeepSeek指导&#xff09; 文章目录 Shell脚本参数设计规范&#xff08;DeepSeek指导&#xff09;A 我问&#xff1a;Q DeepSeek回答&#xff1a;**命令行参数表示规范****标准化表示示例**情况1&#xff1a;必选选项参数值情况2&#xff1a;…

MQTT协议:IoT通信的轻量级选手

文章总结&#xff08;帮你们节约时间&#xff09; MQTT协议是一种轻量级的发布/订阅通信协议。MQTT通信包括连接建立、订阅、发布和断开等过程。MQTT基于TCP/IP&#xff0c;其通信过程涉及多种控制包和数据包。ESP32S3可以通过MQTT协议接收消息来控制IO9引脚上的LED。 想象一…

数据结构——反射、枚举以及lambda表达式

1. 反射 Java的反射&#xff08;reflection&#xff09;机制是在运⾏时检查、访问和修改类、接⼝、字段和⽅法的机制&#xff1b;这种动态获取信息以及动态调⽤对象⽅法的功能称为java语⾔的反射&#xff08;reflection&#xff09;机制。 用途 1. 框架开发 2. 注解处理 3.…

C语言教程(十):C 语言函数详解

一、引言 在 C 语言中&#xff0c;函数是一组执行特定任务的代码块。通过将复杂的程序逻辑划分为多个函数&#xff0c;不仅能提高代码的可读性、可维护性&#xff0c;还便于代码的复用。无论是简单的数学计算&#xff0c;还是复杂的系统操作&#xff0c;函数都发挥着核心作用。…

力扣面试150题--有效的字母异位词和字母异位词分组

Day 24 题目描述 思路 初次思路&#xff1a;如果两个字符串为异位词&#xff0c;说明它们长度相同并且字母出现的次数相同&#xff0c;于是有以下做法&#xff1a; 定义一个map&#xff0c;来保存s中每个字符的出现次数处理特殊情况&#xff0c;如果长度不同&#xff0c;直接…

数理逻辑(Mathematical Logic)综论与跨学科应用

李升伟 整理 数理逻辑&#xff08;Mathematical Logic&#xff09;是现代逻辑学与数学交叉的核心学科&#xff0c;以严格的数学方法研究逻辑推理的形式与规律。其发展深刻影响了数学基础、计算机科学、语言哲学等领域。以下从多个维度综论数理逻辑&#xff1a; 1. 核心分支 命…

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里&#xff1f; 3.1r…

泛型算法——只读算法(一)

在 C 标准库中&#xff0c;泛型算法的“只读算法”指那些 不会改变它们所操作的容器中的元素&#xff0c;仅用于访问或获取信息的算法&#xff0c;例如查找、计数、遍历等操作。 accumulate std::accumulate()是 C 标准库**numeric**头文件中提供的算法&#xff0c;用于对序列…

SvelteKit 最新中文文档教程(21)—— 最佳实践之图片

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

健康养生:开启活力生活的密钥

当我们在健身房看到年逾六旬却身形矫健的老人&#xff0c;在公园偶遇精神矍铄、步伐轻快的长者&#xff0c;总会惊叹于他们的健康状态。其实&#xff0c;这些都得益于长期坚持科学的养生之道。健康养生并非遥不可及的玄学&#xff0c;而是融入生活细节的智慧。​ 在饮食的世界…

Linux信号三部曲:产生机制、处理方式与内核接口

Linux系列 文章目录 Linux系列前言一、背景知识铺垫1.1 信号的基本概念1.2 进程对信号的处理 二、信号的产生2.1 前台进程和后台进程2.2 键盘组合键2.3 kill 命令2.4 系统调用2.4.1 signal()接口2.4.2 kill()接口2.4.3 raise()接口2.4.4 abort()接口 总结 前言 Linux中&#x…

win7/win10/macos如何切换DNS,提升网络稳定性

本篇教程教您如何在Windows10、Windows8.1、Windows7、MacOS操作系统切换DNS&#xff0c;以提升系统的稳定性&#xff0c;获得更好的操作体验。 Windows10及Windows8.1 1、右键单击“此计算机”&#xff0c;然后选择“属性”。进入Windows系统界面后&#xff0c;选择左侧的“…

移动硬盘突然打不开紧急救援指南:从排查到完整恢复‌

突发状况的典型特征‌ 当移动硬盘突然打不开时&#xff0c;用户常会遇到多种异常表现&#xff1a;接入电脑后硬盘指示灯虽亮但无法识别、系统反复提示“设备未连接成功”或弹出“磁盘结构损坏”的警告。部分情况下&#xff0c;资源管理器中的盘符虽可见&#xff0c;但双击后显示…