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.pswp.cn/news/901767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901767.shtml
英文地址,請注明出處:http://en.pswp.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;但雙擊后顯示…