leetcode經典題目(6) 排序

2021-10-07 20:11:14 字數 2731 閱讀 9732

1. 陣列中的第k個最大元素(no.215)

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

解題思路:對陣列進行排序,返回第k個最大的元素。

(1)可以使用排序函式sort,時間複雜度 o(nlogn),空間複雜度 o(1)

class

solution

};

(2)使用堆排序,時間複雜度 o(nlogk),空間複雜度 o(k)。topk (前k大)用小根堆,維護堆大小不超過 k 即可。每次壓入堆前和堆頂元素比較,如果比堆頂元素還小,直接扔掉,否則壓入堆。檢查堆大小是否超過 k,如果超過,彈出堆頂。求前 k 大,用小根堆,求前 k 小,用大根堆。

class

solution

return nums[n-k];}

private

:void

adjust

(vector<

int>

& nums,

int i,

int n)

else

//不用交換

break;}}};

使用stl中的priority_queue來建立堆。greater< int >建立的是小根堆,less< int> 建立的是大根堆。

class

solution

}return heap.

top();}};

(3)使用快速排序。從大到小排序,如果k-1位置上的元素歸位,則找到了第k大的元素。如果歸位的元素在k-1的右側,則接著對該歸位元素的左側區間進行操作;如果歸位元素在k-1的左側,則對右側區間繼續操作。

class

solution

return nums[k-1]

;}private

:int

mypartition

(vector<

int>

& nums,

int l,

int r)

nums[j]

= tmp;

return j;}}

;

2. 出現頻率最多的 k 個元素(no.347)

題目描述:給定乙個非空的整數陣列,返回其**現頻率前 k 高的元素。

解題思路:遍歷一次陣列,使用unordered_map記錄各個數字及其出現的次數。建立乙個大小為k的小根堆,儲存出現頻率最多的k個元素,這裡往堆中新增元素,如果堆的規模大於k,則將堆頂元素彈出,每次彈出的都是當前堆中的最小值。最後將這些元素加入到結果陣列中。

class

solution

while

(k--

)return res;}}

;

3. 根據字元出現頻率排序(no.451)

題目描述:給定乙個字串,請將字串裡的字元按照出現的頻率降序排列。

解題思路:使用unordered_map將字母與出現的次數對應著儲存,然後建立大根堆進行排序。

class

solution

while

(!pq.

empty()

)return res;}}

;

4. 按顏色進行排序(no.75)

題目描述:給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

輸入: [2,0,2,1,1,0];輸出: [0,0,1,1,2,2]

解題思路

初始化0的最右邊界:p0 = 0。在整個演算法執行過程中 nums[idx < p0] = 0. 即p0左端的都為0

初始化2的最左邊界 :p2 = n - 1。在整個演算法執行過程中 nums[idx > p2] = 2. 即p2右端的都為2.

初始化當前考慮的元素序號 :curr = 0.

while curr <= p2 :

若 nums[curr] = 0 :交換第 curr個 和 第p0個 元素,並將指標都向右移。

若 nums[curr] = 2 :交換第 curr個和第 p2個元素,並將 p2指標左移 。

若 nums[curr] = 1 :將指標curr右移。

class

solution

void

sortcolors

(vector<

int>

& nums)

else

if(nums[one]==0

)swap

(nums,one++

,zero++);

//one、zero指標都右移

else

one++

;//one指標右移}}

};

(6)排序之堆排序

文章 靜默空間 堆的概念 在介紹堆排序之前,首先需要說明一下,堆是個什麼玩意兒。堆是一棵順序儲存的完全二叉樹。其中每個結點的關鍵字都不大於其孩子結點的關鍵字,這樣的堆稱為小根堆。其中每個結點的關鍵字都不小於其孩子結點的關鍵字,這樣的堆稱為大根堆。舉例來說,對於n個元素的序列當且僅當滿足下列關係之一時...

九度 題目1202 排序

時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 9374 解決 3285 題目描述 對輸入的n個數進行排序並輸出。輸入 輸入的第一行包括乙個整數n 1 n 100 接下來的一行包括n個整數。輸出 可能有多組測試資料,對於每組資料,將排序後的n個整數輸出,每個數後面都有乙個空格。每組測試資...

九度 題目1202 排序

題目描述 對輸入的n個數進行排序並輸出。輸入 輸入的第一行包括乙個整數n 1 n 100 接下來的一行包括n個整數。輸出 可能有多組測試資料,對於每組資料,將排序後的n個整數輸出,每個數後面都有乙個空格。每組測試資料的結果佔一行。樣例輸入 4 1 4 3 2 樣例輸出 1 2 3 4 2006年華中...