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

2022-03-31 13:20:38 字數 2468 閱讀 6399

題目:

給定乙個無序整型陣列arr,找到陣列中未出現的最小正整數。要求時間複雜度為o(n)空間複雜度為o(1)

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

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

分析:這道題要理解最小正整數的意思,最小的正整數就是1,所以考察的方法就是在陣列中找1,然後找2,依次找下去...。直到第乙個沒有找到的數,這個數就是未出現的最小的正整數。但是這樣的時間複雜度很大,達到了o(n2)。

先看乙個時空複雜度均為o(n)的方案,思路如下:

新建乙個和原陣列大小一致的新陣列,通過遍歷原陣列將其中每個元素e(忽略掉小於1或大於陣列長度的元素)填充到新陣列中[e-1]位置上。之後遍歷新陣列就可找到目標,這個遍歷可能會遇到兩種情況,一般情況下,上一步的操作總有被忽略的元素,每忽略乙個數,新陣列中就會少填充乙個正整數,>,這種情況要找的數就是第乙個值為0的元素的下標+1極端情況下,上一步的操作沒有被忽略的元素,>,這種情況要找的數就是length+1;

為什麼開闢的新陣列大小要和原陣列大小一致?這是為了確保在極端情況下能夠容納下由原陣列中元素組成的從1開始的最長連續整數序列。

為什麼要忽略掉大於陣列長度的元素?這是因為如果存在這樣的數x,剩下的小於length個元素不可能組成1~length的連續整數序列,則x更不可能在連續序列中,就沒必要維護它了。

相應的**實現如下:

1

@org.junit.test

2public

void

test() ));

4 system.out.println("結果:" + func1(new

int ));

5 }/*

out:

6* [-1, 5, 1, 6, 2] >>

7* [1, 2, 0, 0, 5]

8* 結果:3

9* [3, 2, 1, 5, 4] >>

10* [1, 2, 3, 4, 5]

11* 結果:6

12*/

1314

public

int func1(int

arr)

20 newarr[e - 1] =e;21}

22 system.out.println(arrays.tostring(arr) + " >> ");

23system.out.println(arrays.tostring(newarr));

2425

for (int i = 0; i < newarr.length; i++) 29}

30return arr.length + 1;

31 }

view code

再看改進方案,減小空間複雜度為o(1),**如下:

1

@org.junit.test

2public

void

test2() ));

4 system.out.println(funcfinal(new

int));

5 }/*

out:

6* 原陣列:[-1, 5, 1, 6, 2]

7* 處理後:[1, 2, 1, 6, 2]

8* 結果:3

9* 原陣列:[3, 2, 1, 5, 4]

10* 處理後:[1, 2, 3, 4, 5]

11* 結果:6

12*/

1314

public

int funcfinal(int

arr)

36//

分支2、arr[left]是不合法的資料

37//

則先將right減1,然後丟掉不合法的數並將待處理部分最後乙個元素填充到left位置繼續處理

38else

if (arr[left] < left + 1 || arr[left] >right)

42//

分支3、arr[left]合法,但是沒有在理想的位置上

43//

則需要交換arr[left]與其理想位置上元素,然後繼續處理交換後left位置處的元素

44//

求理想位置p的索引:p+1 = arr[left] >> p = arr[left]-1

45else

else53}

54}55 system.out.println("處理後:" +arrays.tostring(arr));

56return left + 1;57}

58private

void swap(int a, int i, int

j)

view code

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

給定乙個無序整型陣列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,找到陣列中未出現的最小正整數 例如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 ...