求一個陣列中沒有出現的最小正數
求一個陣列中沒有出現的最小正數,要求時間複雜度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。
相關文章
- 陣列中未出現的最小正整數陣列
- 陣列中每個陣列元素出現的次數陣列
- python實現給定一個數和陣列,求陣列中兩數之和為給定的數Python陣列
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- 求陣列中k個數的所有組合陣列
- array_multisort 第二個陣列沒有正確排序陣列排序
- 統計陣列個元素出現的個數陣列
- 尋找兩個正序陣列中的中位數陣列
- 找出陣列中只出現一次的數字陣列
- 統計陣列元素中每個元素出現的次數陣列
- 找到無序陣列中最小的k個數陣列
- GO實現:leetcode之尋找兩個正序陣列的中位數GoLeetCode陣列
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- [求解]陣列,分成倆個陣列,陣列值之和的相差最小。陣列
- 尋找兩個正序陣列的中位數問題,方法一:合併陣列檢索法陣列
- 找一個陣列中特別的數陣列
- 求最小k個數
- 4. 尋找兩個正序陣列的中位數陣列
- JZ-040-陣列中只出現一次的數字陣列
- leetcode:41. 缺失的第一個正數(困難,陣列)LeetCode陣列
- js常見演算法(一):陣列去重,打亂陣列,統計陣列各個元素出現的次數, 字串各個字元的出現次數,獲取地址連結的各個引數JS演算法陣列字串字元
- 旋轉陣列中的最小元素陣列
- 程式設計求一維陣列中最大和最小的元素值程式設計陣列
- 統計陣列中各數字(元素)出現的次數陣列
- 求三個數的最小公倍數
- 求區間不同數的個數【樹狀陣列求解】陣列
- 每天一道演算法題:求兩個排序陣列的中位數演算法排序陣列
- 找出陣列中第 k 大的數字及其出現次數陣列
- Matlab 統計陣列中各數字(元素)出現的次數Matlab陣列
- JZ-032-把陣列排成最小的數陣列
- JavaScript如何求陣列的質數JavaScript陣列
- MATLAB自帶的函式tabulate統計一個陣列中各數字(元素)出現的頻數、頻率Matlab函式陣列
- 用一個巨集實現求兩個數中的最大數
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 面試:Java 實現查詢旋轉陣列的最小數字面試Java陣列
- 兩個有序陣列的中位數陣列
- 找出陣列中元素出現次數超過陣列長度一半的元素陣列
- C語言實現將一個陣列中的奇偶數分別存放C語言陣列
- 【LeetCode Hot 100】4. 尋找兩個正序陣列的中位數LeetCode陣列