參考:
題目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 ...