diff --git a/08 - 215. Kth Largest Element in an Array.md b/08 - 215. Kth Largest Element in an Array.md new file mode 100644 index 0000000..c9958e5 --- /dev/null +++ b/08 - 215. Kth Largest Element in an Array.md @@ -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 +```