區間求最值問題高效解決方法

對于區間求最值場景,如果區間不定長度的,可以使用稀疏表進行求解,如果區間是固定長度的,則可以使用分塊的思想(與稀疏表原理類似),都是通過壓縮狀態個數,

1 關于稀疏表的原理詳見:

稀疏表(Sparse Table,ST原理及應用場景
下面是一個稀疏表的python實現

class Solution:def __init__(self, nums):self.nums = numsself.init_value = -9999999999999self.st = self.initSparseTable(self.nums)def initSparseTable(self, nums):# 初始化稀疏表self.init_value = -9999999999999steps = math.floor(math.log(len(self.nums), 2))st = [[self.init_value for _ in range(steps + 1)] for _ in range(len(self.nums))]for i in range(len(self.nums)):k = math.floor(math.log(len(self.nums) - i, 2))for j in range(k):st[i][j] = self.sparseTable(st, i, j)return stdef sparseTable(self, st, i, j):if j == 0:return self.nums[i]if st[i][j] != self.init_value:return st[i][j]else:tmp_max = max(self.sparseTable(st, i, j - 1), self.sparseTable(st, int(i + math.pow(2, j - 1)), j - 1),)st[i][j] = tmp_maxreturn tmp_maxdef maxSlidingWindow(self, nums: list, k: int) -> list[int]:# 求所有k個區間的最值l1 = []j = int(math.floor(math.log(k, 2)))if int(math.pow(2, j)) == k:for i in range(0, len(nums) - k + 1):l1.append(self.st[i][j])else:for i in range(0, len(nums) - k + 1):l1.append(max(self.st[i][j], self.st[i + k - int(math.pow(2, j))][j]))return l1

通過分塊求固定區間長度最值

1,首先將數組nums按照區間的長度k從左到右依次分為若干個長度均為k的小塊

2 申請兩個數組,preMax[i],postMax[i] {i 為數組的下標};preMax[i]表示在nums[i]元素所在的分塊內作為最后一個元素的前綴最大值,postMax[i]表示在nums[i]元素所在的分塊內作為第一個元素的后綴最大值
如下圖所示,假設區間長度=3,數組nums = [1,3,-1,-3,5,3,6,7],i=3時,preMax[3] 表示在塊2 i=3作為前綴最后一個元素的前綴最大值,很明顯就nums[3]一個元素,就是nums[3],

通過一次正序遍歷nums數組可以得到preMax數組
通過一次倒序遍歷nums數組可以得到postMax數組
在這里插入圖片描述

3 根據得到的postMax,preMax數組,可以快速求出任何一個區間[i, i + k - 1]中最值,這里有兩個種情況,當i為k的整倍數或者不為k的整數倍

  • i為k的整數倍
    直接通過postMax[i]獲取結果

  • 當i不為k的整數倍,那么[i, i + k - 1]一定時跨了兩個小塊,假設為[i,j - 1],[j, i + k - 1],其中j為后面那個小塊的首位 元素,則可以取postMax[i]與preMax[ i + k - 1]的最大值作為結果
    下面為python代碼的實現,用來求數組中所有區間為 k的最大值

class Solution:def maxSlidingWindow(self, nums: list[int], k: int) -> list[int]:# 分塊思想preSum = [0] * len(nums)postSum = [0] * len(nums)for i in range(len(nums)):if i % k == 0:curr_max = nums[i]curr_max = max(curr_max, nums[i])preSum[i] = curr_maxcurr_max = nums[-1]for i in range(len(nums) - 1, -1, -1):if i % k == (k - 1):curr_max = nums[i]curr_max = max(curr_max, nums[i])postSum[i] = curr_maxl1 = []for i in range(len(nums) - k + 1):if i % k == 0:l1.append(postSum[i])else:l1.append(max(postSum[i], preSum[i + k - 1]))return l1

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

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

相關文章

Linux程序設計:什么時候選擇開發內核模塊?

最近看一個CPU使用率高的問題,從perf里看,是下面的一個占用的比較多是下面一個 Overhead Source:Line Symbol Shared Object - 8.48% [vdso][1129] 0x1129 B [.] 0x0000000000001129

OpenCV CUDA模塊設備層-----歐幾里得距離函數hypot()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 該函數用于計算兩個無符號字符向量(uchar1)的歐幾里得距離(即直角三角形的斜邊長度),…

惠普HP LaserJet Pro P1106 打印機信息

基本信息 產品類型:黑白激光打印機。上市時間:2011 年。最大打印幅面:A4。網絡打印:不支持網絡打印。雙面打印:手動雙面打印。 性能參數 打印速度:黑白打印速度(ISO,A4)正…

通義靈碼智能體模式在企業級開發中的應用:以云效DevOps自動化流程為例

一、智能體模式的核心能力 通義靈碼的智能體模式區別于傳統代碼補全工具,具備: 語義級理解:解析業務需求、代碼上下文及錯誤日志。自主任務閉環:從問題診斷→ 代碼生成→ 測試覆蓋→ 文檔生成全流程自動化。環境感知&#xff1a…

SQL學習筆記2

DDL、DML、DQL、DCL基礎語法 1、DDL 查詢 查詢所有數據庫:show databases; show databases; 查詢當前數據庫:select database(); select database(); 數據庫創建 創建數據庫:create database [if not exist(若存在重名數據庫,則不創建…

VScode常用快捷鍵【個人總結】

注:快捷鍵以 Windows/Linux 為主,Mac 用戶將 Ctrl 替換為 Cmd,Alt 替換為 Option。 1. 編輯相關 快速復制與剪切 Alt Shift ↓:復制當前行到下方Alt Shift ↑:復制當前行到上方Ctrl X:剪切整行&…

數據結構與算法:線性表-順序表(順序存儲)

一、線性表的定義(邏輯結構) 線性表是由 n (n > 0) 個相同數據類型的數據元素組成的有限序列,其中 n 為線性表的表長,當 n 0 時,線性表為空表。如果用 L 命名線性表,那么一般表示為:L (a1…

從源碼到實踐:Java集合框架面試核心知識點全解析

在Java開發中,集合框架(Java Collections Framework)是最基礎也最常用的工具集。無論是處理業務邏輯時的數據暫存,還是高性能場景下的算法優化,集合的使用都貫穿始終。因此,Java集合相關的面試題幾乎是所有…

【深度學習新浪潮】空間計算的醫療應用技術分析(簡要版)

空間計算是一種通過融合計算機視覺、傳感器技術與三維渲染,將虛擬內容精準錨定到物理空間,實現數字世界與現實世界無縫交互的技術體系。其核心在于讓計算機理解真實環境的結構、位置和動態,從而支持自然交互(如手勢、語音、眼動)和沉浸式體驗。例如,蘋果Vision Pro通過實…

win電腦沒有xcode怎么上傳ipa

在上架IOS項目的時候,遇到一個問題,如下圖,在app store connect上架的時候,需要選擇一個構建版本,然后它在下方提示,點擊查看上傳工具后,會發現需要下載xcode或mac命令行等工具來上傳編譯后的文…

相機標定與3D重建技術通俗講解

一、什么是相機標定?能解決什么問題? 相機標定是計算機視覺中的基礎技術,簡單來說,就是確定相機從3D世界拍攝到2D圖像時的"轉換規則"。具體解決兩個核心問題: 相機內部屬性:如焦距(…

DeepSeek-Reasoner推理模型示例

《DEEPSEEK原生應用與智能體開發實踐 王曉華 書籍 圖書》【摘要 書評 試讀】- 京東圖書 在之前講解的示例中(指這個示例:通過Prompt提示構建思維鏈-CSDN博客),無論是進行日常對話還是調用特定工具,我們所依賴的底層技…

常說的電源芯片到底指什么?

電源芯片是電子系統中用于管理、轉換和分配電能的集成電路,根據功能和應用場景的不同,主要分為以下幾類: 一、線性穩壓器(LDO, Low Dropout Regulator) LDO內部的基本電路情況如下: LDO內部主要分為四大部…

【大模型學習】項目練習:套殼DeepSeek

這里是阿川的博客,祝您變得更強 ? 個人主頁:在線OJ的阿川 💖文章專欄:AI入門到進階 🌏代碼倉庫: 寫在開頭 現在您看到的是我的結論或想法,但在這背后凝結了大量的思考、經驗和討論 &#x1f4…

筆記03:布線-過孔的調用與添加

布線-過孔的調用與添加 (1)在進行PCB設計時,都必須使用到過孔,對走線進行換層處理。在走線進行打過孔之前,必須先要添加過孔,這樣在PCB布線時才可以使用過孔。 (2)需要使用pad des…

在vscode中,Python程序的內置對象、關鍵字、自定義函數名/類名、字符串進行著色,說明分別是什么顏色?

在 VS Code 中,Python 代碼的著色完全取決于你當前使用的主題。不同主題(如 Dark, Monokai, Solarized Dark, Light, Quiet Light 等)對不同類型的代碼元素會使用不同的顏色。 一、Default Dark(默認的深色主題) impo…

Visual Studio 中使用 AddressSanitizer 指南

Visual Studio 中使用 AddressSanitizer 指南 基于 Microsoft Visual Studio 2022,支持 MSVC 和 Clang 編譯器鏈,本文詳細說明如何在 VS 中配置和使用 AddressSanitizer,用于檢測內存誤用,如消息釋放后訪問、超界讀寫等類型錯誤。…

Flink Sink函數深度解析:從原理到實踐的全流程探索

在Flink的數據流處理體系中,Sink函數作為數據處理的最終出口,肩負著將處理后的數據寫入外部存儲引擎的關鍵使命。它如同數據旅程的終點站,決定著數據的最終歸宿與應用價值。深入理解Sink函數的工作原理、核心概念及實現方式,對構建…

Codex+ 自建中轉 API 部署教程(Windows 版)

📌 一、前置環境準備 安裝 Node.js 和 Codex CLI: npm install -g openai/codex準備 OpenAI API Key 確保你已有的中轉接口兼容 OpenAI 格式, 📌 二、設置 PowerShell 環境變量 # 設置你的 API Key(使用哪家的看你的…

Centos 7離線部署Nginx 高效省時

給腳本執行權限:chmod x install_nginx.sh以root用戶運行:sudo ./install_nginx.sh 腳本如下: #!/bin/bash # Nginx一鍵化部署腳本(修復版本開機自啟) # 需要以root權限運行set -e # 任何命令失敗時立即退出腳本# 定…