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年華中...