【題目】: 給定乙個無序整型陣列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,依次找下去.直到第乙個沒...