Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions 08 - 215. Kth Largest Element in an Array.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
### Solution 1

min heapを使った解法。Arai60の問題に引っ張られて最初にこの解法で書いたがarrayでこれをやるのは結構不自然かも。
こんなことをやるんだったら配列をソートしてk-1番目を出力した方がいい気がする。

```python
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
min_heap = []
for num in nums:
if len(min_heap) < k:
heapq.heappush(min_heap, num)
else:
if num < min_heap[0]:
continue
heapq.heappushpop(min_heap, num)
return min_heap[0]
```

### Solution 2

3-partition quick select
普通のquick selectは以下と未満の判別をしないので都合が悪い(全部同じ要素、みたいな配列が入ってくるとkをスキップしてしまう)

```python
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
if k > len(nums):
raise ValueError("invalid k for the list")
nums = nums[:]
left = 0
right = len(nums) - 1
while True:
pivot = nums[random.randint(left, right)]
l = left
r = right
idx = left
while idx <= r:
if nums[idx] > pivot:
nums[l], nums[idx] = nums[idx], nums[l]
l += 1
idx += 1
elif nums[idx] == pivot:
idx += 1
else:
nums[idx], nums[r] = nums[r], nums[idx]
r -= 1
if l <= k - 1 <= r:
return pivot
elif k - 1 < l:
right = l - 1
elif r < k - 1:
left = r + 1
```