桶排序
荷蘭國旗問題
用於求解kth element問題,也就是第 k 個元素的問題。
可以使用快速排序的 partition() 進行實現。需要先打亂陣列,否則最壞情況下時間複雜度為 o(n2)。
用於求解topk elements問題,也就是 k 個最小元素的問題。使用最小堆來實現 topk 問題,最小堆使用大頂堆來實現,大頂堆的堆頂元素為當前堆的最大元素。實現過程:不斷地往大頂堆中插入新元素,當堆中元素的數量大於 k 時,移除堆頂元素,也就是當前堆中最大的元素,剩下的元素都為當前新增過的元素中最小的 k 個元素。插入和移除堆頂元素的時間複雜度都為 log2n。
堆也可以用於求解 kth element 問題,得到了大小為 k 的最小堆之後,因為使用了大頂堆來實現,因此堆頂元素就是第 k 大的元素。
快速選擇也可以求解 topk elements 問題,因為找到 kth element 之後,再遍歷一次陣列,所有小於等於 kth element 的元素都是 topk elements。
可以看到,快速選擇和堆排序都可以求解 kth element 和 topk elements 問題。
215. kth largest element in an array (medium)
leetcode / 力扣
input: [3,2,1,5,6,4] and k = 2
output: 5
題目描述:找到倒數第 k 個的元素。
排序:時間複雜度 o(nlogn),空間複雜度 o(1)
public
intfindkthlargest
(int
nums,
int k)
堆:時間複雜度 o(nlogk),空間複雜度 o(k)。
public
intfindkthlargest
(int
nums,
int k)
return pq.
peek()
;}
快速選擇:時間複雜度 o(n),空間複雜度 o(1)
public
intfindkthlargest
(int
nums,
int k)
else
if(j < k)
else
}return nums[k];}
private
intpartition
(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)
347. top k frequent elements (medium)
leetcode / 力扣
given [1,1,1,2,2,3] and k = 2, return [1,2].
設定若干個桶,每個桶儲存出現頻率相同的數。桶的下標表示數出現的頻率,即第 i 個桶中儲存的數出現的頻率為 i。
把數都放到桶之後,從後向前遍歷桶,最先得到的 k 個數就是出現頻率最多的的 k 個數。
public
int[
]topkfrequent
(int
nums,
int k)
list
buckets =
newarraylist
[nums.length +1]
;for
(int key : frequencyfornum.
keyset()
) buckets[frequency]
.add
(key);}
list
topk =
newarraylist
<
>()
;for
(int i = buckets.length -
1; i >=
0&& topk.
size()
< k; i--)if
(buckets[i]
.size()
<=
(k - topk.
size()
))else
}int
res =
newint
[k];
for(
int i =
0; i < k; i++
)return res;
}
451. sort characters by frequency (medium)
leetcode / 力扣
input:
"tree"
output:
"eert"
explanation:
public string frequencysort
(string s)
frequencybucket[f]
.add
(c);
} stringbuilder str =
newstringbuilder()
;for
(int i = frequencybucket.length -
1; i >=
0; i--
)for
(char c : frequencybucket[i])}
}return str.
tostring()
;}
荷蘭國旗包含三種顏色:紅、白、藍。
有三種顏色的球,演算法的目標是將這三種球按顏色順序正確地排列。它其實是三向切分快速排序的一種變種,在三向切分快速排序中,每次切分都將陣列分成三個區間:小於切分元素、等於切分元素、大於切分元素,而該演算法是將陣列分成三個區間:等於紅色、等於白色、等於藍色。
leetcode / 力扣
input: [2,0,2,1,1,0]
output: [0,0,1,1,2,2]
題目描述:只有 0/1/2 三種顏色。
public
void
sortcolors
(int
nums)
else
if(nums[one]==2
)else}}
private
void
swap
(int
nums,
int i,
int j)
Leetcode 題解 排序 快速選擇
用於求解kth element問題,也就是第 k 個元素的問題。可以使用快速排序的 partition 進行實現。需要先打亂陣列,否則最壞情況下時間複雜度為 o n2 用於求解topk elements問題,也就是 k 個最小元素的問題。可以維護乙個大小為 k 的最小堆,最小堆中的元素就是最小元素。...
Leetcode題解 DFS 拓撲排序
深度優先搜尋 儲存有向圖 edges collections.defaultdict list 標記每個節點的狀態 0 未搜尋,1 搜尋中,2 已完成 visited 0 numcourses 用陣列來模擬棧,下標 0 為棧底,n 1 為棧頂 result list 判斷有向圖中是否有環 valid...
LeetCode中「排序鍊錶」題解
排序鍊錶 給你鍊錶的頭結點 head 請將其按 公升序 排列並返回 排序後的鍊錶 高階 你可以在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序嗎?示例 1 輸入 head 4 2,1 3 輸出 1,2,3,4 示例 2 輸入 head 1,5,3,4,0 輸出 1 0,3 4,...