假定這個n的長度為特別大
1…找乙個最小數
2.找乙個最大數和乙個最小數
最笨的方法排序
取最大值,和最小值,所需時間為n2
傻子的辦法 比較法
存兩個臨時變數
第乙個臨時變數,一直儲存最小的值,遍歷陣列,遇見比它小的進行交換,複雜度一直為n
另乙個臨時變數,則儲存最大值
聰明點的人 兩兩比較法
第一步 首先讓所有的元素參與兩兩比較,這樣總共比較了n/2次,最大數肯定在勝者組中,最小數肯定在敗者組中
第二步 然後從容量為n/2的勝者組中找到最大的數,最少要比較n/2 - 1次;同理,從容量為n/2的敗者組中找到最小的數,最少要比較n/2 - 1次
第三步 同理,從容量為n/2的敗者組中找到最小的數,最少要比較n/2 - 1次。所以總共需要比較(3n/2) - 2 次。以上假設n為偶數。奇數同理。
這是同時尋找最大數和最小數的最優演算法。
3.找第二小的數
傻子的辦法
一種習慣的方法是:先找出最大的元素,這需要比較n-1次;然後從剩下的n-1個元素中找到最大的,這個元素就是我們要找的第二大元素,這需要比較n-2次。做一總共比較2n-3次。
普通人的辦法
還有乙個更優的方法:
(1) 我們考慮淘汰賽的比較法,淘汰賽結束後,找出冠軍我們需要n-1次比較;如下圖所示,找到12需要比較7次。
(2) 此時我們要考慮到,亞軍應該存在於敗給冠軍的這些選手中(否則,每個元素都至少有兩個元素比它大),由於與冠軍比過的元素個數為┌log2n┐,從這些元素中找到最大值需要比較┌log2n┐ - 1次;如下圖所示,亞軍應該在10,11,4這三個元素中。否則,如果亞軍是5,那麼冠軍12比它大,與它比較過的10也比它大,至少兩個元素大於5,所以5肯定不是亞軍的候選者。
(3)從而找出亞軍要比較n-1+┌log2n┐-1 = n-2+┌log2n┐次比較。這個演算法是尋找亞軍的最優演算法。
4.找m小的數
5.同時尋找最大數和最小數
合併N個長度為L的有序陣列為乙個有序陣列
方案一 新建乙個n l的陣列,將原始陣列拼接存放在這個大陣列中,再呼叫arrays.sort 進行排序,或者使用其它排序方法即可。其實這個題與合併鍊錶很像,但是如果沒有指定每個陣列的長度,做起來就不太方便,所以一般的前提就是陣列長度是一致的 class solution int col array ...
無序陣列中找第K個的數
題目分析 也就是從小往大排,第k小那個數。方法1 排序 nlogn 方法2 利用堆 nlogk 首先將前k個元素構建最大堆,堆頂是前k個元素中第k小的元素。這步複雜度klogk 遍歷剩餘元素 這步複雜度 n k logk 如果新元素 堆頂 堆頂不可能是第k大元素 移除堆頂 將新元素插入堆 否則 新元...
2 返回無序陣列中連續元素的長度
給定乙個無序陣列,返回連續的元素中最長的長度,比如陣列a 7,6,8,1,2,2,5 返回4,並且要求複雜度為o n 這個時候如果不考慮複雜度,那麼就很好解決了,先排序再求長度,考慮到複雜度,就不能排序了,可以使用雜湊表 來幫助我們完成這個運算,如下 public static int getcon...