Leetcode 3510. Minimum Pair Removal to Sort Array II

  • Leetcode 3510. Minimum Pair Removal to Sort Array II
    • 1. 解題思路
    • 2. 代碼實現
  • 題目鏈接:3510. Minimum Pair Removal to Sort Array II

1. 解題思路

這一題和題目3507. Minimum Pair Removal to Sort Array I本質上是同一道題目,唯一的區別在于時間復雜度的要求上面。

對于題目3507,我們可以通過一個二重循環進行實現,時間復雜度為 O ( N 2 ) O(N^2) O(N2),但是放到這里就顯然不行了,我們最多只能允許一個時間復雜度為 O ( N ? l o g N ) O(N\cdot logN) O(N?logN)的算法實現。

而這里難度會有兩個:

  1. 找到當前最小的相鄰元素的和,來進行元素的替換;
  2. 如何判斷當前序列是否已經變成了一個單調非減的序列。

正常來說,這倆都需要 O ( N ) O(N) O(N)的時間復雜度,但是,這里,我們需要對其進行優化。

首先,對于第一個問題,找到最小的相鄰元素的問題,我們可以通過二分搜索的方式實現,找最小的元素,其時間復雜度就是 O ( l o g N ) O(logN) O(logN),但是問題在于我們在合并之后其前后的元素會同時被調整,因此我們需要維護當前的數組,然后對其前后的元素的和進行同步調整。

而對于第二部分的問題,對于單調非減序列的判斷,正常確實需要 O ( N ) O(N) O(N)的時間復雜度,但是這里我們可以通過維護當前數組當中相鄰元素的逆序元素的個數來進行判斷,對于單調非減序列,其逆序元素的總數必然為0。

因此,這就變成了一個數組的維護問題了。

唯一比較坑的是,如果直接使用二分查找的方式,會出現超時的情況,需要使用堆排來對其進行進一步的優化。

2. 代碼實現

給出最終的python代碼實現如下:

class Solution:def minimumPairRemoval(self, nums: List[int]) -> int:n = len(nums)index = [i for i in range(n)]pairs = [(nums[i] + nums[i+1], i) for i in range(n-1)]heapq.heapify(pairs)remove = set()reverse_cnt = 0for i in range(n-1):if nums[i] > nums[i+1]:reverse_cnt += 1m = nwhile reverse_cnt > 0:s, idx = heapq.heappop(pairs)if (s, idx) in remove:continueremove.add((s, idx))i = bisect.bisect_left(index, idx)# replace elementx, y = nums[i], nums[i+1]xi, yi = index[i], index[i+1]nums.pop(i+1)nums[i] = x+yindex.pop(i+1)m -= 1if x > y:reverse_cnt -= 1# maintain pre elementif i-1 >= 0:t, ti = nums[i-1], index[i-1]remove.add((t+x, ti))heapq.heappush(pairs, (t+x+y, ti))if (t+x+y, ti) in remove:remove.remove((t+x+y, ti))if t > x:reverse_cnt -= 1if t > x+y:reverse_cnt += 1# maintain post elementif i+1 < m:t, ti = nums[i+1], index[i+1]remove.add((t+y, yi))heapq.heappush(pairs, (t+x+y, xi))if (t+x+y, xi) in remove:remove.remove((t+x+y, xi))if y > t:reverse_cnt -= 1if x+y > t:reverse_cnt += 1return n - m

提交代碼評測得到:耗時7765ms,占用內存95.4MB。

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

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

相關文章

【數學建模】(時間序列模型)ARIMA時間序列模型

ARIMA時間序列模型詳解及常見時間序列模型概覽 文章目錄 ARIMA時間序列模型詳解及常見時間序列模型概覽1 引言2 ARIMA模型的基本概念3 ARIMA模型的組成部分詳解3.1 AR模型 (自回歸模型)3.2 MA模型 (移動平均模型)3 I (差分) 4 ARIMA模型的建模步驟5 Python實現ARIMA模型6 常見時…

嵌入式AI開發者職業成長路線圖

嵌入式AI開發者職業成長路線圖 一、核心技術能力構建 1. 深度學習框架 TensorFlow/TensorFlow Lite&#xff1a;適合部署到嵌入式設備PyTorch&#xff1a;研究和原型開發ONNX&#xff1a;模型轉換與部署 2. 模型理解與應用 卷積神經網絡(CNN)&#xff1a;圖像識別、目標檢…

單元測試之mockito

簡介 mockito是一款模擬測試框架&#xff0c;用于Java開發中的單元測試。通過mockito&#xff0c;可以創建和配置一個對象&#xff0c;通過它來替換對象的外部依賴。 作用&#xff1a;模擬一個類的外部依賴&#xff0c;保證單元測試的獨立性。例如&#xff0c;在類A中會調用類…

Oracle數據庫數據編程SQL<5 正則表達式函數*****>

Oracle 提供了一組強大的正則表達式函數,用于在 SQL 和 PL/SQL 中進行復雜的模式匹配和文本處理。這些函數基于 POSIX 標準正則表達式,功能強大且靈活。 目錄 一、Oracle 正則表達式函數概覽 二、函數詳解及示例 1. REGEXP_LIKE 2. REGEXP_INSTR 3. REGEXP_SUBSTR 4. …

el-tabs添加按鈕增加點擊禁止樣式

前置文章 一、vue使用element-ui自定義樣式思路分享【實操】 二、vue3&ts&el-tabs多個tab表單校驗 現狀確認 點擊添加按鈕&#xff0c;沒有點擊樣式&#xff0c;用戶感知不明顯沒有限制最大的tab添加數量&#xff0c;可以無限添加 調整目標&代碼編寫 調整目標…

DB-Mysql中TIMESTAMP與DATETIME的區別

文章目錄 ?存儲范圍??時區處理?存儲空間?默認值和自動更新??零值處理?適用場景?總結 在MySQL中&#xff0c;TIMESTAMP和DATETIME是兩種常用的日期時間數據類型&#xff0c;它們雖然都用于存儲日期和時間&#xff0c;但在多個方面存在顯著差異。以下是它們的主要區別&a…

Spring 中有哪些設計模式?

&#x1f9e0; 一、Spring 中常見的設計模式 設計模式類型Spring 中的應用場景單例模式創建型默認 Bean 是單例的工廠模式創建型BeanFactory、FactoryBean抽象工廠模式創建型ApplicationContext 提供多個工廠接口代理模式結構型AOP 動態代理&#xff08;JDK/CGLIB&#xff09;…

C# Winform 入門(3)之尺寸同比例縮放

放大前 放大后 1.定義當前窗體的寬度和高度 private float x;//定義當前窗體的寬度private float y;//定義當前窗臺的高度 2.接收當前窗體的尺寸大小 x this.Width;//存儲原始寬度ythis.Height;//存儲原始高度setTag(this);//為控件設置 Tag 屬性 3.聲明方法&#xff0c;獲…

從零開始的編程-java篇1.6.3

前言&#xff1a; 通過實踐而發現真理&#xff0c;又通過實踐而證實真理和發展真理。從感性認識而能動地發展到理性認識&#xff0c;又從理性認識而能動地指導革命實踐&#xff0c;改造主觀世界和客觀世界。實踐、認識、再實踐、再認識&#xff0c;這種形式&#xff0c;循環往…

【Redis】數據的淘汰策略

目錄 淘汰策略方案&#xff08;8種&#xff09; LRU和LFU策略的區別 使用建議 手搓LRU算法 方式一 方式二 大家好&#xff0c;我是jstart千語。今天和大家回來聊一下redis&#xff0c;這次要講的是它的淘汰策略。為什么需要淘汰策略呢&#xff0c;就是當redis里面的內存占…

【前端】Node.js一本通

近兩天更新完畢&#xff0c;建議關注收藏點贊。 目錄 復習Node.js概述使用fs文件系統模塊path路徑模塊 http模塊 復習 為什么JS可以在瀏覽器中執行 原理&#xff1a;待執行的JS代碼->JS解析引擎 不同的瀏覽器使用不同的 JavaScript 解析引擎&#xff1a;其中&#xff0c;C…

【AI論文】JavisDiT: 具備層次化時空先驗同步機制的聯合音視頻擴散Transformer

摘要&#xff1a;本文介紹了一種新型的聯合音頻-視頻擴散變換器JavisDiT&#xff0c;該變換器專為同步音頻-視頻生成&#xff08;JAVG&#xff09;而設計。 基于強大的擴散變換器&#xff08;DiT&#xff09;架構&#xff0c;JavisDiT能夠根據開放式用戶提示同時生成高質量的音…

Java-實現公有字段自動注入(創建人、創建時間、修改人、修改時間)

文章目錄 Mybatis-plus實現自動注入定義 MetaObjectHandler配置 MyBatis-Plus 使用 MetaObjectHandler實體類字段注解使用服務類進行操作測試 Jpa啟用審計功能實現自動注入添加依賴啟動類啟用審計功能實現AuditorAware接口實體類中使用審計注解 總結 自動注入創建人、創建時間、…

金融機構開源軟件風險管理體系建設

開源軟件為金融行業帶來了創新活力的同時&#xff0c;也引入了一系列獨特的風險。金融機構需要構建系統化的風險管理體系&#xff0c;以識別和應對開源軟件在全生命周期中的各種風險點。下面我們將解析開源軟件在金融場景下的主要風險類別&#xff0c;并探討如何建立健全的風險…

圖形渲染中的定點數和浮點數

三種API的NDC區別 NDC全稱&#xff0c;Normalized Device Coordinates Metal、Vulkan、OpenGL的區別如下&#xff1a; featureOpenGL NDCMetal NDCVulkan NDC坐標系右手左手右手z值范圍[-1,1][0,1][0,1]xy視口范圍[-1,1][-1,1][-1,1] GPU渲染的定點數和浮點數 定點數類型&a…

同花順客戶端公司財報抓取分析

目標客戶端下載地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要難點在登陸,獲取token中的 jgbsessid (每次重新登錄這個字段都會立即失效,且有效期應該是15天的) 抓取jgbsessid 主要通過安裝mitmproxy 使用 mitmdump + 下邊的腳本實現監聽接口…

QT工程建立

打開軟件新建一個工程 選擇chose 工程命名&#xff0c;選擇保存路徑&#xff0c;可以自己選擇&#xff0c;但是不要有中文路徑 默認的直接下一步 任意選一個下一步 點擊完成 之后是這個界面&#xff0c;點擊右下角的綠色三角形編譯一下 實驗內容 添加類 第一個是建立cpp和.h文件…

【NLP 53、投機采樣加速推理】

目錄 一、投機采樣 二、投機采樣改進&#xff1a;美杜莎模型 流程 改進 三、Deepseek的投機采樣 流程 Ⅰ、輸入文本預處理 Ⅱ、引導模型預測 Ⅲ、候選集篩選&#xff08;可選&#xff09; Ⅳ、主模型驗證 Ⅴ、生成輸出與循環 騙你的&#xff0c;其實我在意透了 —— 25.4.4 一、…

ffmpeg時間基與時間戳

時間基、時間戳 時間基&#xff1a;表示時間單位的分數&#xff0c;用來定義視頻或音頻流中時間的精度。其形式是一個分數&#xff0c;分子通常為 1&#xff0c;而分母則表示每秒的單位數。 時間戳&#xff1a;代表在時間軸里占了多少個格子&#xff0c;是特定的時間點。 時間…

激光加工中平面傾斜度的矯正

在激光加工中&#xff0c;加工平面的傾斜度矯正至關重要&#xff0c;直接影響加工精度和材料處理效果。以下是系統的矯正方法和步驟&#xff1a; 5. 驗證與迭代 二次測量&#xff1a;加工后重新檢測平面度&#xff0c;確認殘余誤差。 反饋優化&#xff1a;根據誤差分布修正補償…