歡迎關注微博:
首先看看題目要求:
給定乙個無序的整數陣列,怎麼找到第乙個大於
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的「基數排序」就順利的搞定此題了。
**也非常好寫,不過在交換兩數時要注意判斷下兩個數字是否相等,不然對於像這樣的資料會出現死迴圈。
完整的**如下:
[cpp]view plain
copy
// 【白話經典演算法系列之十六】「基數排序」之陣列中缺失的數字
// by morewindows( )
// 歡迎關注
#include
void
swap(
int&a,
int&b)
intfindfirstnumbernotexistenceinarray(
inta,
intn)
void
printfarray(
inta,
intn)
intmain()
; //int a[maxn] = ;
inta[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...