LeetCode算法心得——零數組變換IV(0-1背包)

大家好,我是晴天學長,很久很久沒有寫算法題解了,今天開始轉python了。💪💪💪


1)統計打字方案數

在這里插入圖片描述
給你一個長度為 n 的整數數組 nums 和一個二維數組 queries ,其中 queries[i] = [li, ri, vali]。
每個 queries[i] 表示以下操作在 nums 上執行:
從數組 nums 中選擇范圍 [li, ri] 內的一個下標子集。 將每個選中下標處的值減去 正好 vali。
零數組 是指所有元素都等于 0 的數組。
返回使得經過前 k 個查詢(按順序執行)后,nums 轉變為 零數組 的最小可能 非負 值 k。如果不存在這樣的 k,返回 -1。
數組的 子集 是指從數組中選擇的一些元素(可能為空)。


示例 1:

輸入: nums = [2,0,2], queries = [[0,2,1],[0,2,1],[1,1,3]]

輸出: 2

解釋:

對于查詢 0 (l = 0, r = 2, val = 1):
將下標 [0, 2] 的值減 1。
數組變為 [1, 0, 1]。
對于查詢 1 (l = 0, r = 2, val = 1):
將下標 [0, 2] 的值減 1。
數組變為 [0, 0, 0],這就是一個零數組。因此,最小的 k 值為 2

示例 2:

輸入: nums = [4,3,2,1], queries = [[1,3,2],[0,2,1]]

輸出: -1

解釋:

即使執行完所有查詢,也無法使 nums 變為零數組。

示例 3:

輸入: nums = [1,2,3,2,1], queries = [[0,1,1],[1,2,1],[2,3,2],[3,4,1],[4,4,1]]

輸出: 4

解釋:

對于查詢 0 (l = 0, r = 1, val = 1):
將下標 [0, 1] 的值減 1。
數組變為 [0, 1, 3, 2, 1]。
對于查詢 1 (l = 1, r = 2, val = 1):
將下標 [1, 2] 的值減 1。
數組變為 [0, 0, 2, 2, 1]。
對于查詢 2 (l = 2, r = 3, val = 2):
將下標 [2, 3] 的值減 2。
數組變為 [0, 0, 0, 0, 1]。
對于查詢 3 (l = 3, r = 4, val = 1):
將下標 4 的值減 1。
數組變為 [0, 0, 0, 0, 0]。因此,最小的 k 值為 4

示例 4:

輸入: nums = [1,2,3,2,6], queries = [[0,1,1],[0,2,1],[1,4,2],[4,4,4],[3,4,1],[4,4,5]]

輸出: 4

提示:
1 <= nums.length <= 10
0 <= nums[i] <= 1000
1 <= queries.length <= 1000
queries[i] = [li, ri, vali]
0 <= li <= ri < nums.length
1 <= vali <= 10

2) .算法思路

我們首先注意到nums長度最長才只有10,我們可以枚舉每一個詢問,處理出一個arr[i],arr[i]也是一個數組,代表了的位置i有哪些詢問可以使用,并且是有序的。然后對于每一個詢問可以處理的位置,加到對應的位置的數組中即可。

然后對于每一個位置,就是判斷選擇這些詢問,是否能夠湊出這個位置的值,并且是在用到的詢問最小的情況下,那么這就是01背包,對每一個位置我們都求一個01背包,定義f[i][j]代表了前i個詢問是否能夠湊出j。然后對于每一個位置求出的最少詢問數求最大值。

需要注意的是,這道題如果num所有元素為0的時候,是直接返回0,需要判斷一下,有點坑。


3) .算法步驟

1.創建一個二維數組arr,用于記錄每個點能夠被哪些區間覆蓋。對于每個查詢,遍歷區間中的點,將該點與對應的查詢值存儲在arr中。

2.對于每個點,遍歷其覆蓋的區間,使用動態規劃來嘗試湊出該點的值。定義一個二維數組f,其中f[i][j]表示在考慮前i個區間的情況下,是否可以湊出值為j。

3.初始化f[0][0] = True,表示不選取任何區間時,可以湊出值為0。

4.對于每個區間,考慮選取或不選取該區間。如果選取該區間,則需要判斷是否可以湊出值為j - arr[k][i][1]。

5.如果最終在考慮完所有區間后,可以湊出該點的值,則記錄下使用的區間索引,并更新cur的值。

6.最終返回mx + 1,其中mx表示使用的區間索引的最大值。


4).代碼示例

class Solution:def minZeroArray(self, nums: List[int], queries: List[List[int]]) -> int:if max(nums) == 0:return 0n = len(nums)m = len(queries)arr = [[] for _ in range(n)]#每個點能夠被哪一些區間覆蓋for i in range(m):l, r, val = queries[i]for j in range(l, r + 1):arr[j].append((i, val))#對于每一個點,問題轉換為了在盡量少用的情況下,湊出nums[i]mx = -inffor k,x in enumerate(nums):f = [[False] * (x + 1) for _ in range(len(arr[k]) + 1)]f[0][0] = Truecur = inffor i in range(len(arr[k])):for j in range(x + 1):#不選f[i + 1][j] = f[i][j]#選if j - arr[k][i][1] >= 0:f[i + 1][j] |= f[i][j - arr[k][i][1]] if f[i + 1][x]:cur = min(cur,arr[k][i][0])breakelse:return -1mx = max(mx,cur)return mx + 1

5).總結

這個算法主要是通過動態規劃來解決問題。首先,對于每個點,算法找出它能夠被哪些區間覆蓋。然后,問題轉化為對于每個點,如何在盡量少的情況下湊出該點的值。


試題鏈接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898060.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898060.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

superset部署記錄

具備網絡條件的&#xff0c;完全可以一鍵部署&#xff0c;不需要折騰。網絡條件不具備時&#xff0c;部署記錄留存備查。 1、正常模式 詳細介紹參考&#xff1a;【開源項目推薦】Apache Superset——最優秀的開源數據可視化與數據探索平臺-騰訊云開發者社區-騰訊云 (tencent.c…

AI大模型完全指南:從核心原理到行業落地實踐

目錄 大模型技術演進脈絡核心原理解析與數學基礎主流大模型架構對比開發環境搭建與模型部署Prompt Engineering高階技巧垂直領域應用場景實戰倫理與安全風險防控前沿發展方向與學習資源 一、大模型技術演進脈絡 1.1 發展歷程里程碑 2017&#xff1a;Transformer架構誕生&…

HTB 學習筆記 【中/英】《前端 vs. 后端》P3

&#x1f4cc; 這篇文章講了什么&#xff1f; 介紹了 前端&#xff08;客戶端&#xff09; 和 后端&#xff08;服務器端&#xff09; 的區別。解釋了 全棧開發&#xff08;Full Stack Development&#xff09;&#xff0c;即前端后端開發。介紹了 前端和后端常用的技術。討論…

golang中的結構體

1.簡介 go也支持面向對象編程(OOP)&#xff0c;但是和傳統的面向對象編程有區別&#xff0c;并不是純粹的面向對象語言。所以說go支持面向對象編程特性是比較準確的。go沒有類(class)&#xff0c;go語言的結構體(struct)和其它編程語言的類(class)有同等的地位&#xff0c;你可…

Day 64 卡瑪筆記

這是基于代碼隨想錄的每日打卡 參加科學大會&#xff08;第六期模擬筆試&#xff09; 題目描述 ? 小明是一位科學家&#xff0c;他需要參加一場重要的國際科學大會&#xff0c;以展示自己的最新研究成果。 ? 小明的起點是第一個車站&#xff0c;終點是最后一個車站。然…

《C語言中\0:字符串的神秘“終結者”》

&#x1f680;個人主頁&#xff1a;BabyZZの秘密日記 &#x1f4d6;收入專欄&#xff1a;C語言 &#x1f30d;文章目入 引言一、字符串的定義與存儲二、\0&#xff1a;字符串的終結標志三、\0在字符串操作中的作用四、\0的陷阱與注意事項五、\0與字符串的動態分配六、總結 引言…

九、Prometheus 監控windows(外部)主機

一、監控 Windows 主機的方法 方式 1:使用 Windows Exporter Windows Exporter(wmi_exporter) 是 Prometheus 官方推薦的 Windows 監控工具,它可以采集 CPU、內存、磁盤、網絡、進程、服務狀態等 指標。 方式 2:使用 Node Exporter for Windows node_exporter 主要用于…

TCP/IP協議中三次握手(Three-way Handshake)與四次揮手(Four-way Wave)

TCP/IP協議中三次握手&#xff08;Three-way Handshake&#xff09;與四次揮手&#xff08;Four-way Wave&#xff09; 一、TCP三次握手&#xff08;Three-way Handshake&#xff09;二、TCP四次揮手&#xff08;Four-way Wave&#xff09;三、常見問題解答總結為什么三次握手不…

Java集成WebSocket實現消息推送,詳細步驟以及出現的問題如何解決

Java集成WebSocket實現消息推送 WebSocket是一種在單個TCP連接上進行全雙工通信的協議,非常適合實現實時消息推送功能。與傳統的HTTP請求-響應模式不同,WebSocket建立連接后可以保持長連接狀態,服務器可以主動向客戶端推送數據,這使得它成為實現聊天應用、通知系統和實時數…

如何在Linux中切換用戶?

Linux切換用戶 在Linux系統中&#xff0c;切換用戶可以通過使用su命令和sudo命令實現 1、su命令 su是switch user的縮寫&#xff0c;用于切換到另一個用戶。su命令的語法如下&#xff1a; su [選項] [用戶名]以下是一些示例&#xff1a; # 切換到root用戶 su - # 切換到指定…

網頁制作16-Javascipt時間特效の設置D-DAY倒計時

01、效果圖 02、應用 new Date()//返回今天日期 new Date("April 1,2025")//返回目標日期 document.write()//文檔顯示 getTime()返回當日毫秒數 Math.floor(amadays / (1000 * 60 * 60 * 24)//把毫秒換算天 03、代碼 <!doctype html> <html> &…

c#Winform也可以跨平臺了GTK框架GTKSystem.Windows.Forms

一、簡介 >> 新版下載&#xff0c;問題求助 QQ群&#xff1a;1011147488 1032313876 236066073&#xff08;滿&#xff09; Visual Studio原生開發&#xff0c;無需學習&#xff0c;一次編譯&#xff0c;跨平臺運行. C#桌面應用程序跨平臺&#xff08;windows、linux、…

`lower_bound`、`upper_bound` 和 `last_less_equal`

lower_bound、upper_bound 和 last_less_equal。它們的作用是在 有序數組 中查找目標值的位置。下面是對每個函數的詳細解釋&#xff1a; 1. lower_bound 函數 功能&#xff1a; 在有序數組 a 中查找第一個 大于或等于 target 的元素的位置。 參數&#xff1a; a[]&#xf…

網絡安全常識科普(百問百答)

汪乙己一到店&#xff0c;所有喝酒的人便都看著他笑&#xff0c;有的叫道&#xff0c;“汪乙己&#xff0c;你又監控員工隱私了&#xff01;”他不回答&#xff0c;對柜里說&#xff0c;“來兩個fofa。”便排出三個比特幣。他們又故意的高聲嚷道&#xff0c;“你一定又在電報群…

JSON 序列化 反序列化

序列化&#xff0c;反序列化 其實就是轉換數據格式的過程。 序列化 (Serialization) 是將【對象的狀態信息】轉換為【可以存儲或傳輸的形式】的過程。即&#xff1a;把C#中的類 轉換成 JSON格式的字符串&#xff0c;就是序列化。其中【對象的狀態信息】就是類的各種屬性。 …

如何優化AI模型的Prompt:深度指南

隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;AI模型在文本生成、翻譯、問答等領域的應用越來越廣泛。在使用這些模型時&#xff0c;**Prompt&#xff08;提示&#xff09;**的質量直接影響輸出結果的好壞。優化Prompt不僅能提升生成文本的準確性&#xf…

五大基礎算法——模擬算法

模擬算法 是一種通過直接模擬問題描述的過程或規則來解決問題的算法思想。它通常用于解決那些問題描述清晰、步驟明確、可以直接按照規則逐步實現的問題。以下是模擬算法的核心概念、適用場景、實現方法及經典例題&#xff1a; 一、核心概念 問題描述清晰 問題的規則和步驟明確…

【DeepSeek應用】DeepSeek模型本地化部署方案及Python實現

DeepSeek實在是太火了,雖然經過擴容和調整,但反應依舊不穩定,甚至小圓圈轉半天最后卻提示“服務器繁忙,請稍后再試。” 故此,本文通過講解在本地部署 DeepSeek并配合python代碼實現,讓你零成本搭建自己的AI助理,無懼任務提交失敗的壓力。 一、環境準備 1. 安裝依賴庫 …

過濾空格(信息學奧賽一本通-2047)

【題目描述】 過濾多余的空格。一個句子中也許有多個連續空格&#xff0c;過濾掉多余的空格&#xff0c;只留下一個空格。 【輸入】 一行&#xff0c;一個字符串&#xff08;長度不超過200&#xff09;&#xff0c;句子的頭和尾都沒有空格。 【輸出】 過濾之后的句子。 【輸入樣…

一周學會Flask3 Python Web開發-SQLAlchemy更新數據操作-班級模塊

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程&#xff1a; 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili list.html頁面&#xff0c;加一個更新操作超鏈接&#xff1a; <!DOCTYPE html> <html lang"en"> <…