question 1 列表查重
給定一個列表,假如里面有任何重復元素返回true,否則返回false
答案:
利用set函數能很簡單的解決這類重復的問題。
下面我用了字典來統計,但是發現用get函數會慢很多
快 55ms
慢 80ms
用了dict的內置函數確實會增加一些時間損耗,所以自己權衡(但是用get方法建立元素統計的話代碼很簡便)
question 2:查詢二叉樹里面的兩個元素和是不是?k
給定一個查詢樹,和值k,問樹里面的兩個元素能不能組成k(和為k)
我的答案:
最開始我想到的是利用二叉搜索樹的結構特點,用搜索樹來搜索? y=k-cur.val,可以看到這個想法還是比較耗時間的,因為對于每一個節點,都要調用一下搜索
別人的方法:
只遍歷一次樹,但是將值保存下來,這樣每一遇到要查詢的時候就調用hash查詢,這樣能夠保證只用O(n)的時間就完成任務。
這里面要明白:假設 樹有兩個元素 a+b=k,遍歷的時候先遇到了a,這時候在hash表中查詢b=k-a,沒有查詢到,保存a到hash表,繼續遍歷,遇到b,查詢hash表a=k-b,成功。所以這種方法只要樹里面存在滿足要求的元素,一定能查詢的到
question 3 建立二叉樹
給定一組列表,要求建立二叉樹,根節點為列表中最大的元素,左子樹由列表左邊建立(以最大元素為界),右子樹由列表右邊建立
我的方法:
這個題目很適合用遞歸的方法做:
1.找到列表的最大數,將列表分成兩部分
2.用最大數建立根節點,遞歸用子列表建立子節點