メインコンテンツへスキップ

NeetCode 150 [Heap/Priority Queue]medium:KthLargestElementInAnArray

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

NeetCodeのSolutionを書いていく
#

Kth Largest Element in an Array
#

問題
#

ソートされていない整数の配列numsと整数kが与えられます。 k番目に大きな要素を返しなさい。 ソートせずに解けますか?

#

Input: nums = [2,3,1,5,4], k = 2 Output: 4

Input: nums = [2,3,1,1,5,5,4], k = 3 Output: 4

制約
#

  • 1 <= k <= nums.length <= 10000
  • -1000 <= nums[i] <= 1000
  • 計算量:O(n*longk)
  • メモリ:O(k)

メモ
#

pythonのソートはO(n log n)の計算量がかかるらしい。(by ChatGPT) これだと指定のO(n log k)を超えてしまう。 しかもソートしないで解けますか?とのこと。 メモリがO(k)何だから、k個までは保持できる。 heapqのにpushしながら、小さい方は消していったらどうだろうか。最後にright popして返す。 これだとheapqに保持する数は最大kなのでpushに最大でO(log k)となり、n個処理するのにO(n log k)の時間がかかってしまうでいけそう。

import heapq
from typing import List


class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        min_queue: List[int] = []
        for num in nums:
            heapq.heappush(min_queue, num)
            if len(min_queue) > k:
                heapq.heappop(min_queue)
        return min_queue[0]

以下で行けたらしい。

class Solution:
    def findKthLargest(self, nums, k):
        return heapq.nlargest(k, nums)[-1]
Reply by Email

関連記事

NeetCode 150 [Heap / Priority Queue]medium:K Closest Points to Origin
· loading · loading
NeetCode 150 [Heap / Priority Queue]:easy 2/2
· loading · loading
NeetCode 150 [Trees]medium:preorder、inorderな配列から2分木を再構成する
· loading · loading