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

2021-07-10 20:29:51 字數 1044 閱讀 7557

【題目】: 給定乙個無序整型陣列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)

三、利用這種陣列的特性

1.    先排序

2.    再利用該特性搜尋

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)

else if(arr[l]> r || arr[l] <= l || arr[arr[l] - 1] == arr[l])//不合法

else//合法但是沒有在理想的位置上

}return l + 1;

}時間複雜度o(n),改變了原陣列。 
  

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

陣列中未出現的最小正整數 給定乙個無序陣列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,依次找下去.直到第乙個沒...