求一個陣列中沒有出現的最小正數
求一個陣列中沒有出現的最小正數,要求時間複雜度O(n),空間複雜度O(1)。
給出方法思路,演算法程式碼。
這個題目,在網上也搜到一些博文,不過有的方法有些問題,有的方法並不能得到正確答案,有的方法可以得到正確答案,但複雜度不滿足。當然只是我覺得的,也有可能是我的問題。
方法一:
方法思路:用一個變數初始化為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]的查詢”,這裡的時間演算法複雜度是O(n*n),同時空間複雜度O(n)。
方法三:
方法思路:首先找出陣列裡的最大值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;)
這個演算法是都可以得到正確答案的,問題在於空間複雜度不是O(1)。
方法四(正確答案):
方法思路:使用陣列下標,通過交換,保證陣列下標為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。
相關文章
- 求陣列中未出現的最小正整數陣列
- 陣列中未出現的最小正整數陣列
- 陣列中每個陣列元素出現的次數陣列
- 41. First Missing Positive(找到陣列中未出現的最小正整數)陣列
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- python實現給定一個數和陣列,求陣列中兩數之和為給定的數Python陣列
- 【谷歌面試題】求陣列中兩個元素的最小距離谷歌面試題陣列
- 求陣列中k個數的所有組合陣列
- 計算陣列中每個數字出現的次數陣列
- array_multisort 第二個陣列沒有正確排序陣列排序
- 陣列1——求一個陣列的最大子陣列陣列
- C語言 有一個整形陣列a,有10個元素,要求輸出陣列中的全部元素C語言陣列
- 尋找兩個正序陣列中的中位數陣列
- 統計陣列個元素出現的個數陣列
- 找出陣列中只出現一次的數字陣列
- 統計陣列元素中每個元素出現的次數陣列
- 把陣列排成最小的數陣列
- java求一個整數的最小因子Java
- 找到無序陣列中最小的k個數陣列
- 有一個已經排好序的陣列。現輸入一個數,要求按原來的規律將它插入陣列中。陣列
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- matlab統計一個陣列中各元素出現的頻數、頻率Matlab陣列
- 演算法求陣列中的最大值最小值演算法陣列
- 陣列-07. 求一批整數中出現最多的個位數字(20)陣列
- 找一個陣列中特別的數陣列
- 尋找兩個正序陣列的中位數問題,方法一:合併陣列檢索法陣列
- [求解]陣列,分成倆個陣列,陣列值之和的相差最小。陣列
- 4. 尋找兩個正序陣列的中位數陣列
- JZ-040-陣列中只出現一次的數字陣列
- 劍指offer 陣列中只出現一次的數字陣列
- 求Matlab矩陣中各個不同元素或者某個元素出現的次數Matlab矩陣
- 旋轉陣列中的最小元素陣列
- 統計陣列中各數字(元素)出現的次數陣列
- 每天一題(2)--旋轉陣列求最小值陣列
- 從面試題中學演算法(2)---求陣列中唯一n個出現1次的數字(n=1,2,3)面試題演算法陣列
- GO實現:leetcode之尋找兩個正序陣列的中位數GoLeetCode陣列
- js常見演算法(一):陣列去重,打亂陣列,統計陣列各個元素出現的次數, 字串各個字元的出現次數,獲取地址連結的各個引數JS演算法陣列字串字元
- 程式設計求一維陣列中最大和最小的元素值程式設計陣列