【LeetCode】209. 長度最小的子數組(前綴和 + 二分)

【LeetCode】209. 長度最小的子數組(前綴和 + 二分)

    • 題目描述
    • 前綴和
    • 二分優化
    • 前綴和總結
    • 二分總結

題目描述

題目鏈接:【LeetCode】209. 長度最小的子數組(前綴和 + 二分)

給定一個含有 n 個整數的數組和一個整數 target。

找出該數組中滿足其總和大于等于 target 的長度最小的子數組 [numsl,numsl+1,…,numsr?1,numsr][\text{nums}_l, \text{nums}_{l+1}, \dots, \text{nums}_{r-1}, \text{nums}_r][numsl?,numsl+1?,,numsr?1?,numsr?] 返回其長度。如果不存在符合條件的子數組,返回 0。

示例 1:

輸入:target = 7, nums = [2,3,1,2,4,3]
輸出:2
解釋:子數組 [4,3] 是該條件下的長度最小的子數組。

示例 2:

輸入:target = 4, nums = [1,4,4]
輸出:1

示例 3:

輸入:target = 11, nums = [1,1,1,1,1,1,1,1]
輸出:0

提示:

1 <= target <= 10910^9109
1 <= nums.length <= 10510^5105
1 <= nums[i] <= 10410^4104

進階:

如果你已經實現 O(n) 時間復雜度的解法, 請嘗試設計一個 O(n log(n)) 時間復雜度的解法。

前綴和

class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length, res = Integer.MAX_VALUE;int[] sum = new int[n];for (int i = 0; i < n; i++) {sum[i] = (i == 0) ? nums[0] : sum[i - 1] + nums[i];if (nums[i] >= target) {return 1;}if (sum[i] >= target) {res = Math.min(res, i + 1);}}for (int i = 0; i < n; i++) {for (int j = i; j < n && j - i <= res; j++) {if (sum[j] - sum[i] >= target) {res = Math.min(res, j - i);break;}}}return res == Integer.MAX_VALUE ? 0 : res;}}

超出時間限制 18 / 21 個通過的測試用例

二分優化

class Solution {public int minSubArrayLen(int target, int[] nums) {int res = Integer.MAX_VALUE, n = nums.length;// 前綴和int[] sums = new int[n];for (int i = 0; i < n; i++) {sums[i] = (i == 0) ? nums[0] : sums[i - 1] + nums[i];if (nums[i] >= target) {return 1;}if (sums[i] >= target) {res = Math.min(res, i + 1);}}// 二分for (int i = 0; i < n; i++) {int index = search(sums, sums[i] + target);res = (index == -1 || index == sums.length) ? res : Math.min(res, index - i);}return res == Integer.MAX_VALUE ? 0 : res;}public int search(int[] sums, int sum) {int l = -1, r = sums.length;while (l + 1 != r) {int m = (l + r) / 2;if (sums[m] < sum) {l = m;} else {r = m;}}return r;}}

前綴和總結

兩種前綴和數組定義:

第一種定義:

S[0] = 0, S[i] = A[0] + A[1] + … + A[i-1] (i>=1)
區間和計算: Sum(L, R) = S[R+1] - S[L] (求 A[L] 到 A[R] 的和)

for (int i = 0; i < n; i++) {
prefix[i + 1] = prefix[i] + nums[i];
}

sum[left, right] = prefix[right+1] - prefix[left]

第二種定義:

S[0] = A[0], S[i] = A[0] + … + A[i] (i>=0)
注意:在第二種定義下,當L=0時,我們需要單獨處理,以避免S[L-1]出現負數下標。

for (int i = 1; i < n; i++) {
prefix[i] = prefix[i - 1] + nums[i];
}

sum[left, right] = prefix[right] - (left>0 ? prefix[left-1] : 0)

二分總結

二分模板:

l = -1, r = N
while l + 1 ≠ r:m = ?(l + r)/2?if IsBlue(m):l = melse:r = m
return l or r
查找目標IsBlue條件返回的值
第一個 ≥target 的元素<targetr
最后一個 <target 的元素<targetl
第一個 >target 的元素≤targetr
最后一個 ≤target 的元素≤targetl

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

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

相關文章

文件系統----底層架構

當我們談到文件系統的時候&#xff0c;最重要的點在于&#xff1a;文件的內容與屬性是如何存儲在磁盤中的&#xff1f;以及操作系統是如何精準定位到這些文件內容的&#xff1f;在談及文件的內核前&#xff0c;我們先來了解一下儲存文件的硬件-----硬盤一.理解硬件首先我們來看…

小程序開發平臺,自主開發小程序源碼系統,多端適配,帶完整的部署教程

溫馨提示&#xff1a;文末有資源獲取方式全開源與自主開發源碼完全開放&#xff1a;開發者可自由修改前端界面、后端邏輯及數據庫結構&#xff0c;支持深度定制&#xff08;如調整用戶端交互流程、商家端管理功能等&#xff09;。技術棧透明&#xff1a;基于主流技術&#xff0…

stp拓撲變化分類

Max Age 20sHellotime 2sForward delay 153、拓撲改變需要多長時間1&#xff09;根橋故障&#xff1a;需要50秒&#xff08;Max age2個forwarding delay&#xff09;2&#xff09;非直連鏈路&#xff1a;非直連故障在穩定的STP網絡&#xff0c;非根橋會定期收到來自根橋的BPDU報…

一、深度學習——神經網絡

一、神經網絡 1.神經網絡定義&#xff1a;人工神經網絡&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;也簡稱為神經網絡&#xff08;NN&#xff09;&#xff0c;是一種模仿生物神經網絡結構和功能的計算模型。人腦可以看作是一個生物神經網絡&#xff0c;由…

【牛客算法】 小紅的奇偶抽取

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 示例二、解題思路2.1 核心算法設計2.2 性能優化關鍵2.3 算法流程圖三、解法實現3.1 解法一:字符串分離法3.1.1 初級版本分析3.2 解法二:數學逐位構建法(推薦)3.2.1 優化版本分析四、總結與拓展4.1 關鍵優化技…

Maven 繼承:構建高效項目結構的利器

一、引言 Maven 是一個強大的項目管理工具&#xff0c;它通過標準化的項目結構和依賴管理極大地簡化了 Java 項目的開發流程。在 Maven 中&#xff0c;繼承是一種非常有用的功能&#xff0c;它允許我們創建一個父項目&#xff0c;其他子項目可以繼承這個父項目的配置信息&#…

Mysql組合索引的update在多種情況下的間隙鎖的范圍(簡單來說)

簡單來說&#xff0c;當 UPDATE 語句的 WHERE 條件使用了組合索引&#xff0c;并且需要鎖定不存在的“間隙”來防止幻讀時&#xff0c;就會產生間隙鎖。間隙鎖的范圍取決于 WHERE 條件如何利用組合索引&#xff0c;以及數據庫的隔離級別。 我們用圖書館的例子。比如&#xff1a…

什么是Apache Ignite的affinity(親和性)

在 Apache Ignite 中&#xff0c; affinity&#xff08;親和性&#xff09; 是一種用于控制數據分布和查詢性能的重要機制。它允許開發者指定數據如何在集群中的節點之間分布&#xff0c;從而優化數據訪問和查詢效率。以下是關于 affinity 的詳細解釋&#xff1a;數據親和性&a…

youtube圖論

dfs排序lifo & fifo存儲方式鄰接矩陣dijstra處理過的保存/更新&#xff0c;意味著一個節點避免了重復訪問bfs dfs

借助ssh實現web服務的安全驗證

背景 公有云服務器 http 服務 80端口&#xff0c;想做到安全訪問無須HTTPS 客戶端證書方便、快捷、安全 SSH 隧道 本地代理 使用 SSH 隧道將 HTTP 服務“隱藏”在 SSH 之后&#xff1a; # 客戶端建立隧道&#xff08;將本地 8080 轉發到服務器的 80 端口&#xff09; ssh…

狀態機在前端開發中的藝術:從理論到框架級實踐

文章目錄一 狀態機&#xff1a;復雜邏輯的終結者1.1 什么是狀態機&#xff1f;1.2 為何前端需要狀態機&#xff1f;二 狀態機核心概念深度解析2.1 有限狀態機&#xff08;FSM&#xff09;與分層狀態機&#xff08;HSM&#xff09;2.2 狀態機的數學表示三 前端開發中的狀態機實戰…

把word中表格轉成excle文件

把word中表格轉成excle文件 from docx import Document from openpyxl import Workbook from pathlib import Path# 打開 Word 文檔 document Document(./weather_report.docx) tables document.tables# 輸出文件路徑 output_file Path(./weather_report.xlsx)# 如果文件已存…

運維打鐵: 阿里云 ECS 實例的高效運維與管理

文章目錄思維導圖正文內容一、實例基礎管理1. 實例創建2. 實例配置調整3. 實例停止與啟動二、性能監控與優化1. 系統性能指標監控2. 磁盤 I/O 優化3. 網絡優化三、安全防護1. 防火墻設置2. 賬號安全管理3. 數據備份與恢復四、自動化運維1. 腳本自動化2. 使用云助手五、成本優化…

RV1126平臺(Buildroot Linux)+ SunplusIT SPCA2688 USB攝像頭 RTSP推流全流程復盤與問題解決記錄

# RK RV1126平臺&#xff08;Buildroot Linux&#xff09; SunplusIT SPCA2688 USB攝像頭 RTSP推流全流程復盤與問題解決記錄一、平臺與需求- **硬件平臺**&#xff1a;Rockchip RV1126 - **操作系統**&#xff1a;基于Buildroot定制的Linux系統 - **USB攝像頭**&#xff1a;Su…

深入理解Java虛擬機:Java內存區域與內存溢出異常

前言Java虛擬機&#xff08;JVM&#xff09;的自動內存管理是其核心特性之一&#xff0c;它極大地簡化了開發者的工作&#xff0c;減少了內存泄漏和內存溢出的問題。本文將詳細介紹JVM的自動內存管理機制的內存區域與內存溢出異常問題&#xff0c;包括運行時數據區域、對象的創…

位圖入門算法191. 位1的個數

題目鏈接&#xff1a; 191. 位1的個數 - 力扣&#xff08;LeetCode&#xff09; 這道題讓我們找出一個數字中二進制中1的個數&#xff0c;這個題目我們就用1的&來解決&#xff0c;最后一位有0為0&#xff0c;都是1才是1&#xff0c;我們只需要判斷32次即可。 代碼如下&am…

[架構之美]虛擬機Ubuntu密碼重置

[架構之美]虛擬機Ubuntu密碼重置 當您在虛擬機中運行Ubuntu系統時&#xff0c;忘記密碼不再意味著數據丟失&#xff01;本文將詳細介紹可靠的密碼重置方法&#xff0c;幫助您快速恢復系統訪問權限。 一、虛擬機密碼重置原理與準備 1.1 為什么虛擬機重置密碼更容易 在虛擬機環…

kotlin中withContext,async,launch幾種異步的區別

在 Kotlin 協程中&#xff0c;withContext、async 和 launch 是常用的異步/并發操作函數&#xff0c;它們的主要區別在于用途和返回值&#xff1a;1. launch 作用&#xff1a;啟動一個新的協程&#xff0c;用于執行不返回結果的并發任務。使用場景&#xff1a;適合執行沒有返回…

git 報錯fatal: refusing to merge unrelated histories

解決方案在你操作命令后面加--allow-unrelated-histories 例如&#xff1a; git merge master --allow-unrelated-historiesgit pull或者git push報fatal: refusing to merge unrelated histories 同理&#xff1a; git pull origin master --allow-unrelated-histories

Android 13----在framworks層映射一個物理按鍵

基于Android 13.一、映射步驟確定要映射的物理按鍵值在kl文件中增加鍵值對在InputEventLabels.cpp增加AKEYCODE在keycodes.h中定義AKEYCODE值attrs.xml中增加KEYCODEKeyEvent.java中增加KEYCODE在PhoneManagerWindow等相關類中進行攔截處理相關KEYCODE&#xff0c;屬于具體的業…