演算法總結 堆(正在更新)

2021-09-22 12:27:42 字數 1799 閱讀 9964

參考:

題目2:有序矩陣中第k小的元素

題目描述:給在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

示例:示例 1:輸入: [3,2,1,5,6,4] 和 k = 2 ;輸出: 5

示例 2:輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4;輸出: 4

對陣列進行降序排序, 取下標為k - 1的陣列元素即可。

使用乙個大根堆, 維護乙個元素個數為k的最大堆, 將所有數字放入到最大堆中, 全部放完之後, 最大堆中最小的那個元素就是第k個最大的元素。

public

intfindkthlargest

(int

nums,

int k)

priorityqueue

queue =

newpriorityqueue

<

>()

;for

(int i =

0; i < nums.length; i++)if

(queue.

size()

> k)

}return queue.

peek()

;}

利用快速排序中的partition思想解決,時間複雜度o(n)

public

intfindkthlargest

(int

nums,

int k)

private

intpartition

(int

nums,

int lo,

int hi,

int k)

swap

(nums, lo, less--);

if(k > less && k < more)

else

if(k <= less)

else

}private

void

swap

(int

nums,

int i,

int j)

題目描述:給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。 請注意,它是排序後的第k小元素,而不是第k個元素。

示例:matrix = [

[ 1, 5, 9],

[10, 11, 13],

[12, 13, 15]

],k = 8,

返回 13。

public

intkthsmallest

(int

matrix,

int k)

if(count < k) lo = mid +1;

else hi = mid;

}return lo;

}

public

intkthsmallest

(int

matrix,

int k)

else

if(o1 - o2 <0)

return0;

}));

for(

int i =

0; i < matrix.length; i++

)else

if(matrix[i]

[j]< pq.

peek()

)}}return pq.

remove()

;}

演算法總結 棧(正在更新)

參考 例項解析 題目2 子陣列的最小值之和 1 只允許在一端進行插入和刪除的線性表。2 棧的插入操作稱為壓棧 push 棧的取出操作稱為出棧 pop 3 棧的儲存結構分為順序儲存和鏈式儲存,順序儲存稱為順序棧,鏈式儲存稱為鏈式棧。1 逆序輸出 輸出次序和處理順序顛倒 2 遞迴巢狀 具有自相似性的問題...

演算法總結 深度優先搜尋(正在更新)

參考 例項解析 1 選定乙個未被訪問過的頂點v作為起始頂點 或者訪問指定的起始頂點v 並將其標記為已訪問過 2 搜尋與頂點v鄰接的所有頂點,判斷這些頂點是否被訪問過,如果有未被訪問過的頂點,則任選乙個頂點w進行訪問 再選取與頂點w鄰接的未被訪問過的任乙個頂點並進行訪問,依次重複進行。當乙個頂點的所有...

演算法總結大全(正在日更)

kmp 樸素的演算法 樸素的解釋 exkmp 演算法 最快最簡單的排序 桶排序 解釋很形象 kmp 模板 最精簡的 include include using namespace std const int n 1000002 int next n string s,t int slen,tlen ...