#include
#include
#include
#include
#include
#include
#pragma gcc optimize("ofast")
using
namespace std;
intrand_int
(int a,
int b)
;void
non_repeat
(int n,
int* a)
int i =0;
for(set<
int>
::iterator it = s.
begin()
; it != s.
end(
); it++)}
void
shuffle
(int n,
int* a)
}int
rand_int
(int a,
int b)
intsearch_x
(int x,
int i,
int* ptr,
int* val)
return i;
}inta(
int x,
int head,
int* ptr,
int* val)
intd
(int x,
int head,
int n,
int* ptr,
int* val)
intb
(int x,
int head,
int n,
int* ptr,
int* val)
}return
search_x
(x, i, ptr, val);}
intc
(int x,
int head,
int n,
int* ptr,
int* val)
}delete
idx;
return
search_x
(x, i, ptr, val);}
intmain()
int i = head;
int m =0;
while(1
)}cout <<
"************************"
<< endl;
while(1
)delete
a;delete
ptr;
delete
val;
return0;
}
a,b,c,d分別是最普通的演算法(o(n))、時間複雜度為n
\sqrt n
n的確定性演算法,b的舍伍德演算法形式以及普通的隨機演算法。
下圖是一次執行結果:
可以看到,a,d的執行時間在同乙個量級,時間複雜度為o(n),b,c的執行時間遠遠小於a,d,因為b,c的時間複雜度為o(n
)。o(\sqrt n)。
o(n)。
有序鍊錶轉換二叉搜尋樹
題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。思路分析 我們可以利用兩個指標來訪問鍊錶中的中間元素。當找到鍊錶中的中間元素後,我們將鍊錶從中間元素的左側斷開,做法是使用乙個...
有序鍊錶轉換二叉搜尋樹
題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜...
有序鍊錶轉換二叉搜尋樹
給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 ...