查詢陣列中未出現的最小數

2021-10-24 09:47:37 字數 827 閱讀 2505

記不起是第幾次看到這個題了,突然想著來整理一下,結合之前的餓二分法也算是二分查詢的應用。二分查詢——細節決定成敗

題目:給定乙個包含無序正整數的陣列,從中快速找出未出現的最小自然數。題目意思間接明了,力扣上也有類似的題目,如74.搜尋二維矩陣。

暴力法,當然是直接上迴圈去搜尋,不過如果在資料量大或者二維矩陣下,時間複雜度是在夠嗆。以一維陣列為例,我們先對陣列進行排序,再從頭進行搜尋,陣列首元素大於1,則結果就是1;向後搜尋,如果arr[i]-arr[i-1]>1,則結果應該是arr[i-1]+1。查詢的思路就是這麼簡單。

設想,乙個含有n個元素的陣列,如果其中從1~n都出現過,則沒有重複元素,且排序後,各位置的數比index大1。如果存在未出現過的數,有兩種情況,1、沒有重複,但出現跳躍,陣列中最後乙個元素必然大於index+1,2、重複出現某些數,陣列中的元素的值小於index+1。進一步,我們可以得知,從出現重複或者跳躍之後,有序陣列的數值與其陣列索引不在具有對應關係。顯然,我們可以利用二分查詢法來優化查詢的效率。這和抽屜原理非常相似。實現如下。

#include #include #include using namespace std;

//抽屜原理

int solution(vector& arr)else

}if(right<0) return 1;

return arr[right]+1;

}int main()

}sort(arr.begin(),arr.end());

cout《當然,開頭所說的力扣題目與這有所不同,二維陣列的二分查詢法,略有區別,但是思路也很巧妙,這裡就先不詳述。祝各位大佬天天進步,money多多!

陣列中未出現的最小正整數

陣列中未出現的最小正整數 給定乙個無序陣列arr,找到陣列中未出現的最小正整數 例如arr 1,2,3,4 返回1 arr 1,2,3,4 返回5 要求 時間複雜度為o n o n o n 空間複雜度為o 1 o 1 o 1 輸入描述 第一行為乙個整數n。表示陣列長度。接下來一行n個整數表示陣列內的...

陣列中未出現的最小正整數

給定乙個無序陣列arr,找到陣列中未出現的最小正整數 例如arr 1,2,3,4 返回1 arr 1,2,3,4 返回5 要求 時間複雜度為o n 空間複雜度為o 1 示例1 1,2,3,4 1 方法二 先原地排序,將1 n之間的數字通過交換的方式進行排序 例如 2,3,1,4 第乙個元素nums ...

求陣列中未出現的最小正整數

題目 給定乙個無序整型陣列arr,找到陣列中未出現的最小正整數。要求時間複雜度為o n 空間複雜度為o 1 例如 arr 1,2,3,4 返回1。arr 1,2,3,4 返回5。解法 一 窮舉查詢 最小正整數是1,所以常規的方法就是在陣列中找1,然後是2,依次找下去 一直找到第乙個沒有出現的正整數,...