題目描述:
given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.
for example,
given nums = [0, 1, 3] return 2.
note:
your algorithm should run in linear runtime complexity. could you implement it using only constant extra space complexity?
讀題:
1.時間複雜度o(n)
2.空間複雜度o(1)
知識儲備:
堆排序同時滿足時間和空間複雜度要求。
堆是一棵完全二叉樹。使用最大堆,最大堆的最大元素一定在第0位置,其操作內容如下:對於每個節點i,我們考察他與子節點的大小,如果他比某個子節點小,則將他與子節點中最大的那個互換位置,然後在相應的子節點位置重複操作,直到到達堆的葉子節點或者考察的位置比子節點的值都要大為止。
構建好堆之後,交換0位置元素與頂,將heapsize減1,然後再在根節點出呼叫最大堆過程將新的堆重新最大堆化。依次迴圈,我們每次都能將現有堆中最大的元素放到堆末尾。最後就完成了整個排序過程。堆排序為原位排序(空間小), 且最壞執行時間是o(nlgn),是漸進最優的比較排序演算法。
解題思路:
1.使用堆排序排列陣列
2.從第二個元素開始與上乙個元素的值進行比較,若相差1,則往下,直到某一元素與上乙個元素的值相差2為止
3.注意當缺少的是位於兩端的邊界值
4.注意當陣列只有乙個元素時
提交**:
public
class solution
if (nums.length == 1 && nums[0] == 1)
buildmaxheap();
heapsort();
int re = nums[heap.length-1] + 1;
for(int i = 1; i < nums.length; i++)
}if (nums[0] == 0)
return re;
else
return
0; }
public
void
buildmaxheap()
}public
void
maxify(int i)
public
void
heapsort()
}private
intparent(int i)
private
intleft(int i)
private
intright(int i)
}
演算法 常見演算法題
演算法題 假如有100個不相同的數,比如從1到100,怎樣使用10次取出其中的10個不同的數字,要求每個數取出的概率一樣 一開始沒有說10次,所以我說,使用乙個random函式,以時間為種子來取,當取出乙個時,做標記,下次再取到這個數時,重新取一次 然後他就說了如果只能夠取10次怎麼辦?一開始我想到...
基礎演算法題
1.一百萬富翁遇到一陌生人,陌生人找他談乙個換錢的計畫,計畫如下 我每天給你十萬,而你每天只需要給我一分錢,第二天我仍然給你十萬元,你給我二分錢,第三天我仍然給你十萬,你給我四分錢.你每天給我的錢是前天的兩倍,直到乙個月 30天 百萬富翁很高興,欣然接受拉這個契約.請編寫乙個程式計算這乙個月中陌生人...
演算法題筆記
1 請給出乙個o nlogn 的演算法,使之能夠找出乙個n個數的序列中最長的單調遞增子串行。這是演算法導論中的一道課後題。解法一 利用求最長公共子串行的思想,將n個數的序列a先排序形成乙個有序的序列b,然後利用動態規劃的思想求a與b的最長公共子串行,得到的最長公共子串行就是所求的解。但是我們知道最長...