長(zhǎng)度最小的子數(shù)組題目詳解(Java版)
題目描述
給定一個(gè)含有 n 個(gè)正整數(shù)的數(shù)組和一個(gè)正整數(shù) target 。
找出該數(shù)組中滿足其和 ≥ target 的長(zhǎng)度最小的 連續(xù)子數(shù)組 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其長(zhǎng)度。如果不存在符合條件的子數(shù)組,返回 0 。
示例:
輸入:target = 7, nums = [2,3,1,2,4,3] 輸出:2
輸入:target = 4, nums = [1,4,4] 輸出:1
題解
思路分析
題目要求我們找到和 >= target 的 最小 且 連續(xù) 的子數(shù)組,我們很容易想到暴力枚舉的方法,即訪問數(shù)組的每一個(gè)元素i,并將i作為第一個(gè)元素,向后尋找

暴力枚舉代碼
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int count = 0;
for(int i = 0; i < nums.length; i++){
int sum = 0;
//向后遍歷找到以nums[i]為起始元素的最小數(shù)組
for(int j = i; j < nums.length;j++){
sum += nums[j];
if(sum >= target){
//更新目標(biāo)值 由于count的初始值為0,因此需要更新初始值,
//否則最小值恒為0
if(count > j-i+1 || count == 0){
count = j-i+1;
}
break;
}
}
}
//若count未被更新,則返回0,即沒有子數(shù)組的和大于target,
//若count被跟新,則返回最小的子數(shù)組長(zhǎng)度
return count;
}
}此時(shí)我們通過遍歷訪問了數(shù)組的每個(gè)元素,在訪問每個(gè)元素時(shí),以該元素為起始元素,并向后尋找其最小長(zhǎng)度的子數(shù)組,因此時(shí)間復(fù)制度為O(
)
而,題目所給的數(shù)組中所有元素均是正整數(shù),因此每加上一個(gè)元素,子數(shù)組的和 sum 增加,通過這個(gè)特性,我們可以想到使用滑動(dòng)窗口來解決這個(gè)問題
什么是滑動(dòng)窗口?
滑動(dòng)窗口是一種基于雙指針的思想,兩個(gè)指針指向的元素之間形成了一個(gè)窗口
因此滑動(dòng)窗口是通過兩個(gè)指針來維護(hù)的,那么如何移動(dòng)這兩個(gè)指針,是使用滑動(dòng)窗口解決問題的關(guān)鍵

初始時(shí),兩個(gè)指針都指向0下標(biāo)位置

遍歷元素,若條件不滿足,則將right指針向右移動(dòng),直到條件滿足為止

當(dāng)條件滿足時(shí),則保持右指針不變,開始移動(dòng)左指針 left

在向窗口中添加新元素或從窗口中刪除舊元素時(shí),可能會(huì)更新一些與窗口范圍有關(guān)的數(shù)據(jù)(例如,本題就需要更新最小子數(shù)組的長(zhǎng)度)
如何使用滑動(dòng)窗口解決本題?
(1)我們定義兩個(gè)指針left right,并讓其都指向數(shù)組首元素

(2)此時(shí)窗口內(nèi)只有 2 這一個(gè)元素,不滿足和 sum >= target,因此將right向右移動(dòng),將新的元素加入窗口中,并判斷此時(shí)子數(shù)組的和 sum 是否大于等于target,若滿足,則不再移動(dòng)right

(3)在sum >= target時(shí),首先判斷最小的子數(shù)組長(zhǎng)度是否需要更新,并保持right不變,向右移動(dòng)左指針left,刪除舊的元素,直到sum < target

(4)循環(huán)(2)(3),直到right遍歷完數(shù)組
為什么可以使用滑動(dòng)窗口解決本題?
因?yàn)槲覀円业淖訑?shù)組是連續(xù)的,且數(shù)組中的元素都為正整數(shù),即子數(shù)組中增加一個(gè)元素,子數(shù)組中的元素和sum增加,從窗口中刪除一個(gè)元素,sum減小,因此我們可以通過改變子數(shù)組的兩端元素來更新數(shù)組,因此可以使用滑動(dòng)窗口來解決本題
由于左右指針都只遍歷了一遍數(shù)組,因此時(shí)間復(fù)雜度為O(N)
滑動(dòng)窗口代碼
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int right = 0;
int sum = nums[0];
int len = nums.length;
int count = 0;
while(left <= right && right < len){
//小于目標(biāo)值,向右移動(dòng)右指針right
while(left <= right && right < len && sum < target){
right++;
if(right == len){
break;
}
sum += nums[right];
}
//大于等于目標(biāo)值
while(left <= right && sum >= target){
//更新目標(biāo)值 由于count的初始值為0,因此需要更新初始值,否則最小值恒為0
if((right - left) < count || count == 0){
count = right - left + 1;
}
//左邊值出窗口,left向右移動(dòng)
sum -= nums[left];
left++;
}
}
//若count未被更新,則返回0,即沒有子數(shù)組的和大于target,
//若count被跟新,則返回最小的子數(shù)組長(zhǎng)度
return count;
}
}題目來自:
LCR 008. 長(zhǎng)度最小的子數(shù)組 - 力扣(LeetCode)
總結(jié)
到此這篇關(guān)于長(zhǎng)度最小的子數(shù)組題目的文章就介紹到這了,更多相關(guān)Java長(zhǎng)度最小的子數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)單了解Java多線程實(shí)現(xiàn)的四種方式
這篇文章主要介紹了簡(jiǎn)單了解Java多線程實(shí)現(xiàn)的四種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Spring MVC+MyBatis+MySQL實(shí)現(xiàn)分頁功能實(shí)例
分頁功能是我們?nèi)粘i_發(fā)中經(jīng)常會(huì)遇到的,下面這篇文章主要給大家介紹了Spring MVC+MyBatis+MySQL實(shí)現(xiàn)分頁功能的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06
詳解Spring Kafka中關(guān)于Kafka的配置參數(shù)
這篇文章主要介紹了詳解Spring Kafka中關(guān)于Kafka的配置參數(shù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
MyBatis trim標(biāo)簽核心用法代碼實(shí)戰(zhàn)
MyBatis的<trim>標(biāo)簽用于動(dòng)態(tài)SQL拼接,處理SQL前后綴和多余關(guān)鍵字,避免語法錯(cuò)誤,提升代碼可維護(hù)性,本文給大家介紹MyBatis trim標(biāo)簽核心用法代碼實(shí)戰(zhàn),感興趣的朋友跟隨小編一起看看吧2026-03-03
IDEA實(shí)現(xiàn)通過generator自動(dòng)生成實(shí)體類、dao以及mapper文件
文章主要記錄了使用MyBatis Generator自動(dòng)生成代碼過程中遇到的一些問題及解決方案,包括MyBatis Generator的配置,Lombok插件的整合,生成的mapping中的.xml文件出現(xiàn)代碼重復(fù)的問題解決方法等2026-05-05
java實(shí)現(xiàn)簡(jiǎn)單超市管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單超市管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
在Java中實(shí)現(xiàn)Excel文檔屬性添加的操作指南
在日常的Java開發(fā)工作中,我們經(jīng)常需要與Excel文檔打交道,無論是生成報(bào)表、導(dǎo)入導(dǎo)出數(shù)據(jù),還是進(jìn)行數(shù)據(jù)分析,Excel都扮演著不可或缺的角色,本文將深入探討如何在Java中,利用功能強(qiáng)大的Spire.XLS for Java庫(kù),輕松實(shí)現(xiàn)Excel文檔屬性的添加、修改和讀取2025-12-12

