Leetcode 題解 排序 快速選擇

2021-09-22 19:35:29 字數 1314 閱讀 8092

用於求解kth element問題,也就是第 k 個元素的問題。

可以使用快速排序的 partition() 進行實現。需要先打亂陣列,否則最壞情況下時間複雜度為 o(n2)。

用於求解topk elements問題,也就是 k 個最小元素的問題。可以維護乙個大小為 k 的最小堆,最小堆中的元素就是最小元素。最小堆需要使用大頂堆來實現,大頂堆表示堆頂元素是堆中最大元素。這是因為我們要得到 k 個最小的元素,因此當遍歷到乙個新的元素時,需要知道這個新元素是否比堆中最大的元素更小,更小的話就把堆中最大元素去除,並將新元素新增到堆中。所以我們需要很容易得到最大元素並移除最大元素,大頂堆就能很好滿足這個要求。

堆也可以用於求解 kth element 問題,得到了大小為 k 的最小堆之後,因為使用了大頂堆來實現,因此堆頂元素就是第 k 大的元素。

快速選擇也可以求解 topk elements 問題,因為找到 kth element 之後,再遍歷一次陣列,所有小於等於 kth element 的元素都是 topk elements。

可以看到,快速選擇和堆排序都可以求解 kth element 和 topk elements 問題。

215. kth largest element in an array (medium)

input: [3,2,1,5,6,4] and k = 2

output: 5

題目描述:找到倒數第 k 個的元素。

排序:時間複雜度 o(nlogn),空間複雜度 o(1)

public int findkthlargest(int nums, int k)
:時間複雜度 o(nlogk),空間複雜度 o(k)。

public int findkthlargest(int nums, int k) 

return pq.peek();

}

快速選擇:時間複雜度 o(n),空間複雜度 o(1)

public int findkthlargest(int nums, int k)  else if (j < k)  else 

}return nums[k];

}private int partition(int a, int l, int h)

swap(a, i, j);

}swap(a, l, j);

return j;

}private void swap(int a, int i, int j)

Leetcode 題解 排序

桶排序 荷蘭國旗問題 用於求解kth element問題,也就是第 k 個元素的問題。可以使用快速排序的 partition 進行實現。需要先打亂陣列,否則最壞情況下時間複雜度為 o n2 用於求解topk elements問題,也就是 k 個最小元素的問題。使用最小堆來實現 topk 問題,最小堆...

Leetcode 排序演算法一快速排序

有沒有既不浪費空間又可以快一點的排序演算法呢?那就是 快速排序 啦!光聽這個名字是不是就覺得很高階呢。假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它用來做啥的了 為了方...

Leetcode題解 DFS 拓撲排序

深度優先搜尋 儲存有向圖 edges collections.defaultdict list 標記每個節點的狀態 0 未搜尋,1 搜尋中,2 已完成 visited 0 numcourses 用陣列來模擬棧,下標 0 為棧底,n 1 為棧頂 result list 判斷有向圖中是否有環 valid...