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

2022-08-22 07:48:08 字數 1157 閱讀 3384

給定乙個無序整型陣列arr,找到陣列中未出現的最小正整數。

例如:arr=[-1,2,3,4]。返回1。

arr=[1,2,3,4]。返回5。

要求時間複雜度為o(n),空間複雜度為o(1)。

在遍歷arr之前先生成兩個變數。變數l表示遍歷到目前為止,陣列arr已經包含的正整數範圍是[1,l],所以在沒有開始之前l=0,表示arr沒有包含任何正整數。變數r表示遍歷到目前為止,在後續出現最優狀況的情況下,arr可能包含的正整數範圍是[1,r],所以在沒有開始之前,令r=n,r同時表示arr當前的結束位置。

從左向右遍歷arr,遍歷到位置l,位置l的數為arr[l]。

如果arr[l]=l+1,l++。重複步驟2。

如果arr[l]<=l,沒有遍歷arr[l]之前,arr在後續最優的情況下可能包含的正整數範圍是[1,r],已經包含的正整數範圍是[1,l],所以需要[1+l,r]上的數。[l+1,r]範圍上的數少了乙個,可能包含的正整數範圍縮小,變為[1,r-1],此時把最後位置的數(arr[r-1])放在位置l上,下一步檢查這個數,然後r--。重複步驟2。

如果arr[l]>r,同步驟4。

如果arr[arr[l]-1]==arr[l],說明步驟4和步驟5沒有命中,arr[l]是在[l+1,r]範圍上的數,而且這個數應該是在arr[l]-1位置上。可是此時發現arr[l]-1位置上的數已經是arr[l],說明出現了兩個arr[l],既然在[l+1,r]上出現了重複值,那麼[l+1,r]範圍上的數又少了乙個,同步驟4和步驟5的處理方法。

如果步驟4/5/6都沒有命中,說明發現了[l+1,r]範圍上的數,並且此時並未發現重複。那麼arr[l]應該放到arr[l]-1位置上。

最終l位置和r位置會相同,arr已經包含的正整數範圍是[1,l],返回l+1即可。

public

static

int missnum(int arr) else

if (arr[l] <= l || arr[l] > r || arr[arr[l] - 1] == arr[l]) else

}
return l + 1;
}
public

static

void swap(int arr, int index1, int index2)

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

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