求一個陣列中沒有出現的最小正數

軍說網事發表於2017-12-31

求一個陣列中沒有出現的最小正數,要求時間複雜度On),空間複雜度O1)。

給出方法思路,演算法程式碼。

 

這個題目,在網上也搜到一些博文,不過有的方法有些問題,有的方法並不能得到正確答案,有的方法可以得到正確答案,但複雜度不滿足。當然只是我覺得的,也有可能是我的問題。

 

方法一:

方法思路:用一個變數初始化為1,然後遍歷陣列比這個變數大的就儲存到這個變數裡。

演算法程式碼:略。

舉例:陣列1,2,4,5,,用這個方法求出來的最小就是6,而正確答案是3

問題:這個方法的問題在於沒有考慮正數中間間隔的正數。

 

方法二:

方法思路:首先對陣列進行從小到大的排序,確定大於0的陣列a開始下標i,陣列中最大的元素max,那麼陣列b的範圍是1~max+1,然後從陣列a中查詢b[i]是否存在,若b[i]存在,則b[i]置零,否則進行下一個b[i]的查詢,最後對b陣列進行遍歷,查詢第一個非零的元素即為未出現的最小元素。

演算法程式碼:略。

問題:“在從陣列a中查詢b[i]是否存在,若b[i]存在,則b[i]置零,否則進行下一個b[i]的查詢”,這裡的時間演算法複雜度是On*n),同時空間複雜度On)。

 

方法三:

方法思路:首先找出陣列裡的最大值MAX,然後正整數陣列b[MAX],初始化為0。然後遍歷陣列a

If(a[i]>0 ){b[a[i]]=1;}

最後遍歷陣列b

for(int j=0; j<MAX; j++) if (b[j] == 0 return j;)

 

這個演算法是都可以得到正確答案的,問題在於空間複雜度不是O1)。

 

 

方法四(正確答案):

方法思路:使用陣列下標,通過交換,保證陣列下標為i的元素值為i+1,即arr[i]=i+1,然後從前往後,不滿足此條件的數即為所求。

關鍵程式碼:

 

for(int i =0; i<num; ++i)

{if (data[i]>=1 && data[i]<=num)}

{swap(data[i], data[data[i]-1]);}

注意:這裡從第二個陣列元素開始,同時很重要的判斷條件data[i]>=1 && data[i]<=num,保證arr[i]=i+1



相關文章