資料結構 面試 陣列高頻題 中位數問題第K大問題等

2021-08-22 17:57:58 字數 1846 閱讀 3279

求兩個有序陣列的中位數

奇數個數的中位數只有1個, 偶數個數的中位數可能有兩個。

在有些題目中,把[2 3 5 7] 的中位數認為是4。

在資料量l已知情況下,將求中位數轉化為求第k小問題,本質上是求第k小問題。

暴力解法: o((m+n)/2) 每次取a和b頭部最小的乙個數,直到取到第 l/2 + 1 個數(當l為奇數時)。

求兩個等長、有序陣列的中位數(二分法)

陣列長度為len,資料個數2*len,中位數為第len、len+1大的數。

暴力法:排好序後找。

二分法:忘了,直接查答案吧。

求兩個不等長、有序陣列a和b的中位數(排除法 )

最優解 o(log (m+n)) 。中位數為第k小數。限定陣列為公升序。 如果a[k/2] == b[k/2], 那麼中位數是a[k/2]或者a[k/2]比中位數小,a、b的前k/2的數都要排除, 更新 k = k - k/2 -k/2;如果a[k/2]  < b[k/2],   那麼a[k/2]最多隻可能是第 (k/2)+ (k/2 - 1)= k -1 小的數,所以a的前k/2個數都可以刪除, 更新 k = k - k/2 。 且 b  a的前k/2個數中一定不包含第k大數,否則不斷刪除個 k/2個數,然後 k = k/2。

詳細講解.求兩個不等長、有序陣列a和b的中位數的最優解(排除法 )

(leetcode)旋轉陣列求最小值 (二分法)

旋轉陣列求查詢某個值是否存在(先用二分法logn找到最小值的index,判斷出目標值在leftpart還是rightpart,然後用二分法找到目標值。 不知道是不是最優解,但最優解最多是logm )

【4*】【劍指offer原題】每行從左到右,每列從上到下嚴格遞增(遞減)的二維陣列中,判斷某個數是否存在.

暴力法:先跟每一行的最後乙個數比較確定其在哪一行(o(n)),再在確定的行中二分查詢o(lgm)最優解 o(n), 排除法,見後文。

最優解:

(這一段說得好亂)每一行數或每一列數都算作乙個序列,右上角(或左下角)是兩個序列的頭(或尾),且這兩個序列連起來是乙個嚴格遞增(或遞減)的大序列,角落數在這個遞增或遞減的大序列裡,目標數如果不等於角落裡的數,那麼根據目標數和角落數的相對大小一定可以確定其不在兩個序列中的乙個序列,從而排除這個序列。

不斷做排除,直到角落數等於目標數。   o(n)

例題:暴力:先跟每一行的最後乙個數比較確定其在哪一行(o(n)),再在確定的行中二分查詢o(lgm)

排除法:o(n)

最優解:將輸入的二維陣列a[i][j]和一維陣列b[k]間做單射, b[k] = a[k/m][k%m], 對長度為mn的b陣列做二分查詢,o(lg(mn))

【3*】陣列中出現次數超過一半的數字  o(n)

ret記錄出現次數最多的數,count為其出現的相對次數。 遍歷,當前數字和ret相同,則count++,否則count--,如果count變為0,ret的值取下乙個數字。

無序陣列求最大值、第二大值、第三大值

直接建堆 o(lgn),堆頂就是最大值

【3*】求無序陣列中第 k 大的數或中位數(分陣列長度奇數和偶數)(拓展:最大的 k 個數)

用陣列前k個數建立大小為k的最小堆,堆頂元素始終為堆中的第k大數,普通陣列到堆數組建堆過程o(k).

之後的n-k個數逐一和堆頂比較,如果比堆頂大就替換堆頂,然後堆頂元素下沉直到重新成為堆( o(logk) ), 整體 (n-k)*o(logk)

整體時間複雜度o(nlogk), 額外空間 o(k)

額外空間 o(n)的解法:

建立最大堆 o(n)

找數 o(klgn),即堆陣列轉化為有序陣列。 不斷的從大根堆中刪除堆頂元素放到陣列末尾,原堆部分重新調整為堆(o(lgn)),一共進行k次,陣列最後k個數就是乙個長度為k的降序陣列。

資料結構(一)遞迴 中位數

1 從鍵盤輸入求2的n次方 編寫程式,求2的n次方 mod 5 n為正整數,由使用者輸入,對應每個輸入,輸出乙個整數,求2的n次方 mod 5 的結果 includeusing namespace std int main return count int main struct index of ...

資料結構演算法題 兩個有序陣列的中位數

有三種方法,時間複雜度分別是o m n o k o log m n 注意點 判斷合併後的陣列的元素個數是奇數還是偶數 如果是奇數取中間值 如果是偶數取中間2個數的平均值。兩種求中位數的方法 方法1,判斷奇數個還是偶數個 if lengthall 2 0 else 方法2,不需要判斷奇數個還是偶數個 ...

資料結構 HashMap 面試題8問

面試題8問 1.如果new hashmap 19 bucket陣列有多大?答 hashmap陣列大小初始為2的四次方,16,且每一次都是以2倍增長,陣列大小總是2的次方倍 所以給19大小的空間,需要的陣列長度為最接近19的2的次方倍,也就是2的五次方32 2.hashmap什麼時候開闢bucket陣...