求陣列中未出現的最小正整數
【題目】: 給定一個無序整型陣列arr,找到陣列中未出現的最小正整數。要求時間複雜度為O(N),空間複雜度為O(1)。
例如:
arr=[-1,2,3,4]。返回1。
arr=[1,2,3,4]。返回5。
【解法】
一、窮舉查詢
最小正整數是1,所以常規的方法就是在陣列中找1,然後是2,依次找下去…。一直找到第一個沒有出現的正整數,這個數就是未出現的最小的正整數。
for i = 1 to n
do if i not in A
then return i
return n+1
顯然,這裡的演算法複雜度是O(n^2)。
二、先排序再查詢
第一種方法,每次查詢都是線性查詢,要改進最先想到的自然是二分查詢, 所以:
先排序,用O(nlgn)的快速排序、歸併排序或者堆排序;因為陣列中的元素是一些自然數,我們甚至可以使用O(n) 的基數排序,當然,需要更多的記憶體。
對1..n進行判斷,複雜度也為O(nlgn)
所以,整體的演算法複雜度為O(nlgn)
三、利用這種陣列的特性
- 先排序
- 再利用該特性搜尋
for i = 1 to n
do if A[i] > i
then return i
return n+1
注意到,如果我們使用基數排序,可以將複雜度降低到O(n)。
四、所有可能出現的情況。
(1) arr為整數1,2,3…N的一個隨機排列,那個未出現的最小正整數就是N+1。
(2) arr中有小於1或者大於N的數出現(我們稱之為“不合法”的數),則未出現的最小正整數一定在1到N中間(因為陣列一共只有N個數,如果出現不合法的數,則出現的1到N之間的數的個數一定小於N,故一定有沒有出現的數)。
int missMinNum(int arr[])
{
int l = 0; //l表示已經從1到L已經出現(左邊界),l的初值為0。
int r = arr.length; //如果一個數字過大(不合法),就會被扔掉,用r表示這個右邊界,r初始值為arr長度。
// int temp;
while(l < r)
{
if(arr[l] == l +1)
{
l++;
}
else if(arr[l]> r || arr[l] <= l || arr[arr[l] - 1] == arr[l])//不合法
{
arr[l] =arr[--r];
}
else//合法但是沒有在理想的位置上
{
temp = arr[l];
arr[l] =arr[arr[l] - 1];
arr[temp - 1] = temp;
}
}
return l + 1;
}
時間複雜度O(n),改變了原陣列。
相關文章
- 陣列中未出現的最小正整數陣列
- 41. First Missing Positive(找到陣列中未出現的最小正整數)陣列
- 求一個陣列中沒有出現的最小正數陣列
- 求正整數
- 如何從整數陣列中找到最大和最小數陣列
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- java求一個整數的最小因子Java
- 把陣列排成最小的數陣列
- 陣列-07. 求一批整數中出現最多的個位數字(20)陣列
- 演算法求陣列中的最大值最小值演算法陣列
- 【谷歌面試題】求陣列中兩個元素的最小距離谷歌面試題陣列
- python實現給定一個數和陣列,求陣列中兩數之和為給定的數Python陣列
- 旋轉陣列中的最小元素陣列
- 求陣列中k個數的所有組合陣列
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- 陣列中每個陣列元素出現的次數陣列
- 尋找兩個正序陣列中的中位數陣列
- 面試:Java 實現查詢旋轉陣列的最小數字面試Java陣列
- JZ-032-把陣列排成最小的數陣列
- 【劍指offer】把陣列排成最小的數陣列
- 【陣列】1539. 第 k 個缺失的正整數(簡單)陣列
- JavaScript如何求陣列的質數JavaScript陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 找到無序陣列中最小的k個數陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 求陣列內所有偶數的和陣列
- 輸入一個整數陣列,輸出奇偶數相間排列的陣列陣列
- [求解]陣列,分成倆個陣列,陣列值之和的相差最小。陣列
- 4. 尋找兩個正序陣列的中位數陣列
- 【LeetCode-陣列】陣列式整數加法LeetCode陣列
- 求陣列之和,最小值,最大值,平均值陣列
- 每天一題(2)--旋轉陣列求最小值陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 程式設計求一維陣列中最大和最小的元素值程式設計陣列
- 無序陣列求第K大的數陣列
- JavaScript求陣列數字的平均值JavaScript陣列