Leetcode 題解 排序

2021-10-19 11:39:46 字數 3676 閱讀 8188

桶排序

荷蘭國旗問題

用於求解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,...