[HOT 100] 1964. 找出到每個位置為止最長的有效障礙賽跑路線

文章目錄

      • 1. 題目鏈接
      • 2. 題目描述
      • 3. 題目示例
      • 4. 解題思路
      • 5. 題解代碼
      • 6. 復雜度分析

1. 題目鏈接


1964. 找出到每個位置為止最長的有效障礙賽跑路線 - 力扣(LeetCode)

2. 題目描述


你打算構建一些障礙賽跑路線。給你一個 下標從 0 開始 的整數數組 obstacles ,數組長度為 n ,其中 obstacles[i] 表示第 i 個障礙的高度。

對于每個介于 0n - 1 之間(包含 0n - 1)的下標 i ,在滿足下述條件的前提下,請你找出 obstacles 能構成的最長障礙路線的長度:

  • 你可以選擇下標介于 0i 之間(包含 0i)的任意個障礙。
  • 在這條路線中,必須包含第 i 個障礙。
  • 你必須按障礙在 obstacles 中的 出現順序 布置這些障礙。
  • 除第一個障礙外,路線中每個障礙的高度都必須和前一個障礙 相同 或者 更高 。

返回長度為 n 的答案數組 ans , ans[i] 是上面所述的下標 i 對應的最長障礙賽跑路線的長度

3. 題目示例


示例 1 :

輸入:obstacles = [1,2,3,2]
輸出:[1,2,3,3]
解釋:每個位置的最長有效障礙路線是:
- i = 0: [1], [1] 長度為 1
- i = 1: [1,2], [1,2] 長度為 2
- i = 2: [1,2,3], [1,2,3] 長度為 3
- i = 3: [1,2,3,2], [1,2,2] 長度為 3

示例 2 :

輸入:obstacles = [2,2,1]
輸出:[1,2,1]
解釋:每個位置的最長有效障礙路線是:
- i = 0: [2], [2] 長度為 1
- i = 1: [2,2], [2,2] 長度為 2
- i = 2: [2,2,1], [1] 長度為 1

示例 3 :

輸入:obstacles = [3,1,5,6,4,2]
輸出:[1,1,2,3,2,2]
解釋:每個位置的最長有效障礙路線是:
- i = 0: [3], [3] 長度為 1
- i = 1: [3,1], [1] 長度為 1
- i = 2: [3,1,5], [3,5] 長度為 2, [1,5] 也是有效的障礙賽跑路線
- i = 3: [3,1,5,6], [3,5,6] 長度為 3, [1,5,6] 也是有效的障礙賽跑路線
- i = 4: [3,1,5,6,4], [3,4] 長度為 2, [1,4] 也是有效的障礙賽跑路線
- i = 5: [3,1,5,6,4,2], [1,2] 長度為 2

4. 解題思路


  1. 問題描述:給定一個整數數組obstacles,要求對于每個位置i,計算以obstacles[i]結尾的最長非遞減子序列的長度。
  2. 方法選擇:本題可以使用動態規劃和二分查找的結合方法。動態規劃用于記錄當前的最長非遞減子序列,二分查找用于高效更新和維護這個序列。
  3. 關鍵步驟
    • 維護**dp**列表dp列表用于存儲當前的最長非遞減子序列。對于每個元素v = obstacles[i],在dp中找到第一個大于等于v + 1的位置p
      • 如果p < dp.size(),說明可以替換dp[p]v,以保持dp的非遞減性。
      • 否則,將v添加到dp末尾,擴展最長非遞減子序列。
    • 結果計算:以obstacles[i]結尾的最長非遞減子序列的長度為p + 1,直接存入結果數組ans
  4. 二分查找優化binarySearch函數使用二分查找在dp中找到第一個大于等于target的位置,時間復雜度為O(log k)k為當前dp的長度)。

5. 題解代碼


public class Solution {public int[] longestObstacleCourseAtEachPosition(int[] obstacles) {// 初始化結果數組,ans[i]表示以obstacles[i]結尾的最長障礙子序列的長度int[] ans = new int[obstacles.length];// dp列表用于維護當前的最長遞增子序列List<Integer> dp = new ArrayList<>();for (int i = 0; i < obstacles.length; i++) {int v = obstacles[i];// 在dp中找到第一個大于等于v+1的位置int p = binarySearch(dp, v + 1);if (p < dp.size()) {// 如果找到,用v替換該位置的元素dp.set(p, v);} else {// 否則將v添加到dp末尾dp.add(v);}// 當前最長障礙子序列的長度為p+1ans[i] = p + 1;}return ans;}// 二分查找:在list中找到第一個大于等于target的位置private int binarySearch(List<Integer> list, int target) {int left = 0;int right = list.size();while (left < right) {int mid = left + (right - left) / 2;if (list.get(mid) < target) {left = mid + 1;} else {right = mid;}}return left;}
}

6. 復雜度分析


  1. 時間復雜度
    • 遍歷數組obstacles需要O(n)時間。
    • 對于每個元素,二分查找binarySearch需要O(log k)時間(k為當前dp的長度)。
    • 最壞情況下,dp的長度可能達到n,因此總時間復雜度為O(n log n)
  2. 空間復雜度
    • dp列表最多存儲n個元素,因此空間復雜度為O(n)
    • 結果數組ans也需要O(n)空間。
    • 因此,總空間復雜度為O(n)

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

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

相關文章

2025年KBS SCI1區TOP:增強天鷹算法EBAO,深度解析+性能實測

目錄 1.摘要2.天鷹算法AO原理3.改進策略4.結果展示5.參考文獻6.代碼獲取 1.摘要 本文提出了增強二進制天鷹算法&#xff08;EBAO&#xff09;&#xff0c;針對無線傳感器網絡&#xff08;WSNs&#xff09;中的入侵檢測系統&#xff08;IDSs&#xff09;。由于WSNs的特點是規模…

JavaScript數據類型簡介

在JavaScript中&#xff0c;理解不同的數據類型是掌握這門語言的基礎。數據類型決定了變量可以存儲什么樣的值以及這些值能夠執行的操作。JavaScript支持多種數據類型&#xff0c;每種都有其特定的用途和特點。本文將詳細介紹JavaScript中的主要數據類型&#xff0c;并提供一些…

性能比拼: Elixir vs Go(第二輪)

本內容是對知名性能評測博主 Anton Putra Elixir vs Go (Golang) Performance Benchmark (Round 2) 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準 這是第二輪關于 Elixir 和 Go 的對比測試。我收到了一份來自 Elixir 創作者的 Pull Request &#xff0c;并且我認為…

接口自動化 ——fixture allure

一.參數化實現數據驅動 上一篇介紹了參數化&#xff0c;這篇 說說用參數化實現數據驅動。在有很多測試用例的時候&#xff0c;可以將測試用例都存儲在文件里&#xff0c;進行讀寫調用。本篇主要介紹 csv 文件和 json 文件。 1.讀取 csv 文件數據 首先創建 csv 文件&#xff…

`peft`(Parameter-Efficient Fine-Tuning:高效微調)是什么

peft(Parameter-Efficient Fine-Tuning:高效微調)是什么 peft庫是Hugging Face推出的用于高效參數微調的庫,它能在不調整模型全部參數的情況下,以較少的可訓練參數對預訓練模型進行微調,從而顯著降低計算資源需求和微調成本。以下從核心功能、優勢、常見微調方法、使用場…

編程常見錯誤歸類

上一篇講了調試&#xff0c;今天通過一個舉例回憶一下上一篇內容吧&#xff01; 1. 回顧&#xff1a;調試舉例 在VS2022、X86、Debug的環境下&#xff0c;編譯器不做任何優化的話&#xff0c;下?代碼執?的結果是啥&#xff1f; #include <stdio.h> int main() {int …

在windows上交叉編譯opencv供RK3588使用

環境 NDK r27、RK3588 安卓板子、Android 12 步驟操作要點1. NDK 下載選擇 r27 版本&#xff0c;解壓到無空格路徑&#xff08;如 C:/ndk&#xff09;2. 環境變量配置添加 ANDROID_NDK_ROOT 和工具鏈路徑到系統 PATH3. CMake 參數調整指定 ANDROID_NATIVE_API_LEVEL31、ANDRO…

淺析MySQL事務鎖

在 MySQL 中,事務鎖是用于確保數據一致性和并發控制的重要機制。事務鎖可以幫助防止多個事務同時修改同一數據,從而避免數據不一致和臟讀、不可重復讀、幻讀等問題。 以下是 MySQL 事務鎖的關鍵點總結: 事務鎖:用于確保數據一致性和并發控制。鎖的類型: 行級鎖:InnoDB,粒…

vue3 文件下載(excel/rar/zip)

安裝axios npm install axios 在項目中引入 import axios from axios; 1、get接口excel文件下載 const file_key ref() const downLoadExcel (value:any) > {//file_key.value value axios({method: "get",url: "/api/da/download_excel/",//url:…

RT-Thread RTThread studio 初使用

RT-Thread Studio 下載 https://www.rt-thread.org/studio.html 安裝使用 https://bbs.elecfans.com/jishu_2425653_1_1.html 4 編譯問題解決 問題一&#xff1a;error: unknown type name clock_t 具體的類型值是在sys/_types.h中定義的&#xff0c;需要包含sys/_types.h 這個…

漢諾塔專題:P1760 通天之漢諾塔 題解 + Problem D: 漢諾塔 題解

1. P1760 通天之漢諾塔 題解 題目背景 直達通天路小A歷險記第四篇 題目描述 在你的幫助下&#xff0c;小 A 成功收集到了寶貴的數據&#xff0c;他終于來到了傳說中連接通天路的通天山。但是這距離通天路仍然有一段距離&#xff0c;但是小 A 突然發現他沒有地圖&#xff0…

探索 HumanoidBench:類人機器人學習的新平臺

在科技飛速發展的當下&#xff0c;類人機器人逐漸走進我們的視野&#xff0c;它們有著和人類相似的外形&#xff0c;看起來能像人類一樣在各種環境里完成復雜任務&#xff0c;潛力巨大。但實際上&#xff0c;讓類人機器人真正發揮出實力&#xff0c;還面臨著重重挑戰。 這篇文…

數據結構中的寶藏秘籍之廣義表

廣義表&#xff0c;也被稱作列表&#xff08;Lists&#xff09;&#xff0c;是一種遞歸的數據結構。它就像一個神秘的盒子&#xff0c;既可以裝著單個元素&#xff08;原子&#xff09;&#xff0c;也可以嵌套著其他的盒子&#xff08;子列表&#xff09;。比如廣義表 (a (b c)…

【jenkins】首次配置jenkins

第一步&#xff0c;輸入管理員密碼 cat /var/jenkins_home/secrets/initialAdminPassword第二步&#xff0c;點擊安裝推薦的插件 第三步&#xff0c;創建管理員用戶 第四步&#xff0c;返回實例 第五步&#xff0c; 升級jenkins 第六步&#xff0c; 修復提示 第七步&#xff0c…

Android studio—socketIO庫return與emit的使用

文章目錄 一、Socket.IO庫簡單使用說明1. 后端 Flask Flask-SocketIO2. Android 客戶端集成 Socket.IO3. 布局文件注意事項 二、接受服務器消息的二種方法1. 客戶端接收通過 emit 發送的消息功能使用場景后端代碼&#xff08;Flask-SocketIO&#xff09;客戶端代碼&#xff08…

用Prompt 技術【提示詞】打造自己的大語言智能體

機器如何按照人類的指令執行任務的探索 機器需具備理解任務敘述的能力&#xff0c;以便能夠按照人類的指令執行任務&#xff0c;為機器提供一些范例作為參考&#xff0c;使其能夠理解該執行的任務類型。這樣的學習方式稱為“Instruction learning”&#xff0c;透過精心設計的…

Node.js 數據庫 事務 項目示例

1、參考&#xff1a;JavaScript語言的事務管理_js 函數 事務性-CSDN博客 或者百度搜索&#xff1a;Nodejs控制事務&#xff0c; 2、實踐 2.1、對于MySQL或MariaDB&#xff0c;你可以使用mysql或mysql2庫&#xff0c;并結合Promise或async/await語法來控制事務。 使用 mysql2…

【Mamba】MambaVision論文閱讀

文章目錄 MambaVision一、研究背景&#xff08;一&#xff09;Transformer vs Mamba?&#xff08;二&#xff09;Mamba in CV? 二、相關工作?&#xff08;一&#xff09;Transformer 在計算機視覺領域的進展?&#xff08;二&#xff09;Mamba 在計算機視覺領域的探索? 三、…

前端面試寶典---原型鏈

引言----感謝大佬的講解 大佬鏈接 原型鏈示意圖 原型鏈問題中需要記住一句話&#xff1a;一切變量和函數都可以并且只能通過__proto__去找它所在原型鏈上的屬性與方法 原型鏈需要注意的點 看上圖可以發現 函數&#xff08;構造函數&#xff09;也可以通過__proto__去找到原…

C語言---FILE結構體

一、FILE 結構體的本質與定義 基本概念 FILE 是 C 語言標準庫中用于封裝文件操作的結構體類型&#xff0c;定義于 <stdio.h> 中。它代表一個“文件流”&#xff0c;可以是磁盤文件、標準輸入輸出&#xff08;stdin/stdout/stderr&#xff09;或其他輸入輸出設備。 實現特…