「基數排序」之陣列中缺失的數字

2021-06-28 10:31:50 字數 1298 閱讀 5741

首先看看題目要求:

給定乙個無序的整數陣列,怎麼找到第乙個大於

0,並且不在此陣列的整數。比如

[1,2,0]返回3

,[3,4,-1,1]返回2

,[1, 5, 3, 4, 2]返回6

,[100, 3, 2, 1, 6,8, 5]返回4

。要求使用

o(1)

空間和o(n)

時間。

這道題目初看沒有太好的思路,但是借鑑下《

白話經典演算法系列之十  一道有趣的google面試題

》這篇文章,我們不發現使用「基數排序」正好可以用來解決這道題目。

以為例來簡介這種解法:

從第乙個數字開始,由於a[0]=1,所以不用處理了。

第二個數字為3,因此放到第3個位置(下標為2),交換a[1]和a[2],得到陣列為。由於6無法放入陣列,所以直接跳過。

第三個數字是3,不用處理。

第四個數字是-100,也無法放入陣列,直接跳過。

第五個數字是2,因此放到第2個位置(下標為1),交換a[4]和a[1],得到陣列為,由於6無法放入陣列,所以直接跳過。

此時「基數排序」就完成了,然後再從遍歷陣列,如果對於某個位置上沒該數,就說明陣列缺失了該數字。如缺失的就為4。

這樣,通過第i個位置上就放i的「基數排序」就順利的搞定此題了。

**也非常好寫,不過在交換兩數時要注意判斷下兩個數字是否相等,不然對於像這樣的資料會出現死迴圈。

完整的**如下:

// 【白話經典演算法系列之十六】「基數排序」之陣列中缺失的數字

// by morewindows( )

// 歡迎關注

#include void swap(int &a, int &b)

int findfirstnumbernotexistenceinarray(int a, int n)

void printfarray(int a, int n)

int main()

; //int a[maxn] = ;

int a[maxn] = ;

//int a[maxn] = ;

printfarray(a, maxn);

printf("該陣列缺失的數字為%d\n", findfirstnumbernotexistenceinarray(a, maxn));

return 0;

}

執行結果如下圖所示:

「基數排序」之陣列中缺失的數字

歡迎關注微博 首先看看題目要求 給定乙個無序的整數陣列,怎麼找到第乙個大於 0,並且不在此陣列的整數。比如 1,2,0 返回3 3,4,1,1 返回2 1,5,3,4,2 返回6 100,3,2,1,6,8,5 返回4 要求使用 o 1 空間和o n 時間。這道題目初看沒有太好的思路,但是借鑑下 白...

python之基數排序

基數排序 將整數按位數切割成不同的數字,然後按每個位數分別比較排序。1.先將每個數字按照個位數排序 2.再將每個數字按照十位數排序 3.按照這樣的方式排至最高位 將無序數列變有序 coding utf 8 defradixsort series,digit a 0while a digit buck...

基數排序之重寫

前面博文的基數是基本按課本思路寫的,本篇按 分配 收集 兩個概念在不翻教材情況下再重寫的,以此檢查自己完全理解了基數排序概念。include include include define maxsize 30 typedef struct rcell typedef struct rlist voi...