演算法題 Missing Number(JAVA)

2021-07-27 12:37:32 字數 1567 閱讀 1653

題目描述:

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的最長公共子串行,得到的最長公共子串行就是所求的解。但是我們知道最長...