資料結構與演算法 排序經典題總結

2022-07-07 17:18:15 字數 1128 閱讀 6027

leetcode:陣列中的第k個最大元素

題目描述:

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

示例:

輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4

輸出: 4

思想:

方法一:優先佇列:可直接使用priorityqueue建立小根堆。遍歷陣列,所有元素入隊,保證queue中只有k個元素,超過k就出隊,這樣最後queue中剩餘的k個元素一定前k個最大元素。時間複雜度o(nlog2k),空間複雜度o(k)

方法二:快速選擇:基於快速排序的方法。這裡與快排的區別在於,partition取得樞軸之後,左子表或者右子表,選乙個繼續操作即可,快排是左右子表都要繼續遞迴。

注意:由於本題存在極端樣例,導致快排耗時依然很高(因為快排是越混亂,速度相對越快)。這裡用到乙個小技巧,partition方法中選擇初始樞軸時,不直接選擇low指標對應的元素,而是用隨機數取乙個下標

if(high>low)
加了這一步之後,耗時擊敗99%。時間複雜度o(n),空間複雜度o(1)

**:方法一:優先佇列

public int findkthlargest(int nums, int k) 

return queue.peek();

}

方法二:快速選擇

public int findkthlargest(int nums, int k) 

return nums[k];

}private int partition(int arr, int low, int high)

int pivotkey = arr[low];

while(low=pivotkey) --high;

arr[low] = arr[high];

while(lowarr[high] = arr[low];

}arr[low] = pivotkey;

return low;

}

資料結構與演算法 貪心思想經典題總結

leetcode 分發餅乾 題目描述 假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。對每個孩子 i 都有乙個胃口值 gi 這是能讓孩子們滿足胃口的餅乾的最小尺寸 並且每塊餅乾 j 都有乙個尺寸 sj 如果 sj gi 我們可以將這個餅乾 j 分配給孩子 i 這...

資料結構與演算法 排序總結

這裡討論常用的內部排序 1.直接插入排序 時間複雜度o n 2 void insertsort int a,int size a j x 2.希爾排序 最小增量排序 時間複雜度 void shellsort int a,int size a j x 3.氣泡排序,時間複雜度 o n 2 void b...

資料結構與演算法 排序演算法總結

排序演算法 1 冒泡 對資料的有序性 敏感,一旦排序完成就會 立刻停止,如果待排序的資料是基本有序的,他的排序效率是非常高的。也是實現最簡單的排序,不易出錯,安全性高。2 插入 在已經有序的資料中,新增新的資料,對這個組資料再進行排序比較適合插入排序。3 選擇 是氣泡排序的變種,不是正統的排序方法,...