leetcode 703:データストリームのK番目の大きな要素を見つけるクラス(class)を設計する.注意は、ソート後のK番目の大きな要素であり、K番目の異なる要素ではありません.

7587 ワード

:データストリームのK番目の大きな要素を見つけるクラス(class)を設計します.注意は、ソート後のK番目の大きな要素であり、K番目の異なる要素ではありません.
KthLargestクラスには、データストリームの初期要素を含む整数kと整数配列numsを同時に受信するコンストラクタが必要です.KthLargestを呼び出すたびにaddは、現在のデータストリームのK番目に大きい要素を返します.
例:
int k = 3; int[] arr = [4,5,8,2]; KthLargest kthLargest = new KthLargest(3, arr); kthLargest.add(3);//returns 4 kthLargest.add(5);//returns 5 kthLargest.add(10);//returns 5 kthLargest.add(9);//returns 8 kthLargest.add(4);//returns 8
説明:numsの長さ≧k−1およびk≧1を仮定できます.Related Topicsスタック1390
解答:方法1:直接ソート法
class KthLargest(object):

    def __init__(self, k, nums):
        """
        :type k: int
        :type nums: List[int]
        """
        self.nums = nums
        self.k = k
        self.nums.sort(reverse = True)
        while len(self.nums) > k:
            self.nums.pop()
        
    def add(self, val):
        """
        :type val: int
        :rtype: int
        """
        self.nums.append(val)
        self.nums.sort(reverse = True)
        if len(self.nums) > self.k:
            self.nums.pop()
        return self.nums[-1]

方法2:最小スタックheapq注意:pythonスタックheapqスタックを使用して説明する
import heapq
# leetcode submit region begin(Prohibit modification and deletion)
class KthLargest(object):
    def __init__(self, k, nums):
        """
        :type k: int
        :type nums: List[int]
        """
        self.pool = nums
        heapq.heapify(self.pool)
        self.k = k
        while len(self.pool) > k:
            heapq.heappop(self.pool)
    def add(self, val):
        """
        :type val: int
        :rtype: int
        """
        if len(self.pool) < self.k:
            heapq.heappush(self.pool, val)
        elif val > self.pool[0]:
            heapq.heapreplace(self.pool, val)
        return self.pool[0]        

まとめは,スタックの構造的特徴とpythonが提供するいくつかのスタックの関数機能を理解する必要がある.
簡単な式でスタックの定義を説明します.
大頂炉:arr[i]>=arr[2 i+1]&&arr[i]>=arr[2 i+2]
小天井スタック:arr[i]<=arr[2 i+1]&&arr[i]<=arr[2 i+2]