Java缺失區(qū)間的查找方法
問題描述
問題編號為 163,題目要求我們在給定的閉區(qū)間 [lower, upper] 內(nèi),找出那些在整數(shù)數(shù)組 nums 中缺失的數(shù)字區(qū)間。這就好比我們有一個完整的數(shù)字區(qū)間,但其中部分?jǐn)?shù)字被拿走了,我們需要找出那些空缺的部分。
解題思路與過程剖析
方法簽名
public List<List<Integer>> findMissingRanges(int[] nums, int lower, int upper)
這個方法接收三個參數(shù):一個整數(shù)數(shù)組 nums,以及兩個整數(shù) lower 和 upper,它的任務(wù)是返回一個包含所有缺失區(qū)間的列表。每個缺失區(qū)間都由一個包含兩個整數(shù)的列表表示,分別是區(qū)間的起始和結(jié)束值。
初始化操作
List<List<Integer>> res = new ArrayList<>(); long pre = (long) lower - 1;
這里,我們創(chuàng)建了一個 res 列表,用于存儲最終的結(jié)果。而 pre 變量被初始化為 lower - 1,它的作用是記錄前一個檢查過的數(shù)字,方便我們后續(xù)判斷是否存在缺失區(qū)間。使用 long 類型是為了避免可能出現(xiàn)的整數(shù)溢出問題。
數(shù)組遍歷
for (int i = 0; i <= nums.length; i++) {
long cur = i == nums.length ? (long) upper + 1 : nums[i];我們通過一個 for 循環(huán)來遍歷數(shù)組 nums。需要注意的是,循環(huán)條件是 i <= nums.length,這意味著我們會多進(jìn)行一次迭代。在最后一次迭代時,cur 會被設(shè)為 upper + 1,這樣做是為了確保我們能檢查到區(qū)間 [lower, upper] 的最后一個數(shù)字。
檢查缺失區(qū)間
if (cur - pre > 1) {
List<Integer> list = new ArrayList<>();
list.add((int) pre + 1);
list.add((int) cur - 1);
res.add(list);
}在每次迭代中,我們會比較 cur 和 pre 的差值。如果差值大于 1,說明在 pre 和 cur 之間存在缺失的數(shù)字,我們就創(chuàng)建一個新的區(qū)間,起始值為 pre + 1,結(jié)束值為 cur - 1,并將這個區(qū)間添加到結(jié)果列表 res 中。
更新 pre
pre = cur;
為了確保下一次檢查的準(zhǔn)確性,我們將 pre 更新為當(dāng)前的 cur,這樣在下次迭代時,我們就能基于新的 pre 值繼續(xù)判斷是否存在缺失區(qū)間。
返回結(jié)果
return res;
最后,我們返回包含所有缺失區(qū)間的列表 res,這就是我們整個算法的最終輸出。
完整代碼
class Solution{
publicList<List<Integer>>findMissingRanges(int[] nums,int lower,int upper){
List<List<Integer>> res =newArrayList<>();
long pre =(long) lower -1;
for(int i =0; i <= nums.length; i++){
long cur = i == nums.length ?(long) upper +1: nums[i];
if(cur - pre >1){
List<Integer> list =newArrayList<>();
list.add((int) pre +1);
list.add((int) cur -1);
res.add(list);
}
pre = cur;
}
return res;
}
}復(fù)雜度分析
時間復(fù)雜度
雖然原內(nèi)容中時間復(fù)雜度標(biāo)記為 O(∗),但實(shí)際上,我們只對數(shù)組 nums 進(jìn)行了一次遍歷,因此時間復(fù)雜度為 O(n)O(n),其中 nn 是數(shù)組 nums 的長度。
空間復(fù)雜度
空間復(fù)雜度方面,除了存儲結(jié)果的列表 res 外,我們只使用了常數(shù)級的額外空間,所以空間復(fù)雜度為 O(m)O(m),這里的 mm 是缺失區(qū)間的數(shù)量。
通過以上的分析,我們可以看到,這個算法巧妙地利用了一次遍歷和簡單的條件判斷,高效地解決了缺失區(qū)間的查找問題。希望大家在遇到類似的算法問題時,也能像“東百牧碼人”一樣,通過清晰的思路和簡潔的代碼來攻克難題。
以上就是Java缺失區(qū)間的查找方法的詳細(xì)內(nèi)容,更多關(guān)于Java查找缺失區(qū)間的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatisplus多表關(guān)聯(lián)分頁查詢多種實(shí)現(xiàn)方式
本文主要介紹了Mybatisplus多表關(guān)聯(lián)分頁查詢多種實(shí)現(xiàn)方式,包括使用XML自定義SQL、Wrapper搭配自定義SQL、使用DTO與自定義SQL及結(jié)合PageHelper實(shí)現(xiàn)分頁查詢,感興趣的可以了解一下2025-03-03
10個Java程序員熟悉的面向?qū)ο笤O(shè)計原則
這篇文章主要為大家詳細(xì)介紹了Java程序員應(yīng)當(dāng)知道的10個面向?qū)ο笤O(shè)計原則,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Spring?Boot實(shí)現(xiàn)分布式任務(wù)調(diào)度的步驟
Spring?Boot提供了一些工具和框架,可以幫助我們輕松地實(shí)現(xiàn)分布式任務(wù)調(diào)度,在本文中我們將介紹如何使用Spring?Boot、Spring?Cloud、Quartz和Redis來實(shí)現(xiàn)分布式任務(wù)調(diào)度,感興趣的朋友跟隨小編一起看看吧2023-06-06
mybatis建立插入postgresql的json類型數(shù)據(jù)的方法
本文介紹如何通過自定義MyBatis JSON處理器,解決將JSON數(shù)據(jù)插入PostgreSQL json字段時的報錯問題,實(shí)現(xiàn)成功插入,感興趣的朋友一起看看吧2025-07-07
IntelliJ?IDEA快速查詢maven依賴關(guān)系圖文教程
Maven提供了來查看依賴關(guān)系,而IDE往往提供了更加便利的方式,比如Eclipse或者IDEA都有類似的功能,下面這篇文章主要給大家介紹了關(guān)于IntelliJ?IDEA快速查詢maven依賴關(guān)系的相關(guān)資料,需要的朋友可以參考下2023-11-11
使用Idea或Datagrip導(dǎo)入excel數(shù)據(jù)的方法
這篇文章主要介紹了使用Idea或Datagrip導(dǎo)入excel數(shù)據(jù)的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀
這篇文章主要為大家介紹了AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

