215 陣列中的第K個最大元素

2021-09-28 11:34:03 字數 2652 閱讀 6160

題目:

【方法一&二】

時間複雜度: o(n*logk), 向大小為k的堆中新增元素的時間複雜度為o(logk),我們將重複該操作n

空間複雜度:o(k)  用於儲存k個堆元素

自己解答(速度太慢?有待提高):

# @time : 2019/10/9 下午01:04

# @file : 陣列中第k大元素_215.py

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

示例 1:

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

輸出: 5

示例 2:

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

輸出: 4

說明:你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。

"""import heapq

import time

b = [3,2,1,5,6,4]

class solution:

def findkthlargest(self, nums, k):

heap = nums

# print(heap)

self.heapsort(heap)

# print(heap)

# new =

# for i in heap:

# if i not in new:

new = heap[::-1]

print(new)

find = new[k-1]

return find

def max_heapify(self, heap, heapsize, root):

"""堆調整"""

left = 2*root + 1

right = left + 1

larger = root

if left < heapsize and heap[larger] < heap[left]:

larger = left

if right < heapsize and heap[larger] < heap[right]:

larger = right

if larger != root:

heap[larger], heap[root] = heap[root], heap[larger]

self.max_heapify(heap, heapsize, larger)

def build_max_heap(self, heap):

"""構造乙個堆"""

heapsize = len(heap)

for i in range((heapsize-2)//2, -1, -1): # 從後往前調整

self.max_heapify(heap, heapsize, i)

def heapsort(self, heap):

"""將根節點取出與最後一位做對調,對前面len-1個節點繼續進行對調整過程"""

self.build_max_heap(heap)

for i in range(len(heap) - 1, -1, -1):

heap[0], heap[i] = heap[i], heap[0]

self.max_heapify(heap, i, 0) # size 不斷減小,這裡是i

分析:還是調庫的 heapq 速度快啊,基本比自己裸寫快3倍

【方法三】快速選擇演算法, 類似快排

待定

215 陣列中的第K個最大元素

思路1 快排 考慮先使用快排實現,練習快排。時間複雜度o n 如果我們把每次分割槽遍歷的元素個數加起來,就是 n n 2 n 4 n 8 1。這是乙個等比數列求和,最後的和等於 2n 1。所以,時間複雜度就為 o n 因為一次快排可以實現乙個數歸位,比較index和n k的大小 如果index n ...

215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。輸入 3,2,1,5,6,4 和 k 2 輸出 5 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 你可以假設 k 總是有效的,且 1 k 陣列的長度。思路和演...

215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 首先明白一點,題目要求返回第n個最大的元...