[Likou] ハッシュテーブル+順序集合:2034年。株価変動
1. トピックの紹介
株価のデータ ストリームが提供されます。データ ストリーム内の各レコードには、次の 2 つのデータが含まれます。
- タイムスタンプ
- このタイムスタンプの株価に対応する価格。
残念ながら、株式市場には固有の変動性があるため、株価記録は時系列順に取得されない場合があります。場合によっては、一部の記録が間違っている可能性があります。データ ストリーム内に同じタイムスタンプを持つ 2 つのレコードが出現した場合、前のレコードは誤ったレコードとみなされ、後から出現するレコードによって前の誤ったレコードが修正されます。
1) 実装するアルゴリズムを設計してください:
- 特定のタイムスタンプでの株価を更新します。同じタイムスタンプで以前の価格が存在する場合、この操作により以前の間違った価格が修正されます。
- 現在のレコードから最新の株価を検索します。最新の株価とは、最新のタイムスタンプを持つ株価と定義されます。
- 現在記録されている株価の最高値を見つけます。
- 現在記録されている株式の最低価格を見つけます。
2) StockPrice クラスを実装するコード:
- StockPrice() はオブジェクトを初期化します。現在、株価レコードはありません。
- void update(int timestamp, int Price) は、株価をタイムスタンプ時点の価格に更新します。
- int current() は最新の株価を返します。
- int minimum() は最高株価を返します。
- int minimum() は株価の最低価格を返します。
3) 例:
2. アイデア
1) 同じタイムスタンプが複数回出現する可能性があるため、後続のレコードは前のレコードを修正 (上書き) するため、ハッシュ テーブルを使用して各タイムスタンプに対応する株価を記録できます。
- 最新の株価を返す操作では、最大のタイムスタンプを維持し、最大のタイムスタンプを使用してハッシュ テーブルを検索して最新の株価を取得できます。
- 株式の最高価格と最低価格を返す操作では、現在ハッシュ テーブルにある株式の最高価格と最低価格を知る必要があります。ハッシュ テーブル内の株価を維持するために順序付きセットを使用できます。順序付きセット内の最大値と最小値は、現在のハッシュ テーブル内の株式の最高値と最低値です。
したがって、StockPrice クラスには、最大タイムスタンプ、ハッシュ テーブル、および順序付けされたコレクションが含まれる必要があります。初期化されると、最大タイムスタンプは 0 に設定され、ハッシュ テーブルと順序付きセットは空に設定されます。
- 更新操作の場合:
- ハッシュテーブルからタイムスタンプ timestamp に対応する元の価格を取得します ハッシュテーブルにタイムスタンプ timestamp に対応する元の価格が存在しない場合は、元の価格を 0 として記録します (実際の価格は 0 より大きいため、元の価格を記録できます) 0 はタイムスタンプがハッシュ テーブルにないことを意味します)。
- ハッシュ テーブル内のタイムスタンプ timestamp に対応する価格を新しい価格に更新します。
- 元の価格が 0 より大きい場合、つまり、前のタイムスタンプに対応するレコードが存在する場合、元の価格は順序付きセットから削除されます。
- ソートされたコレクション価格に新しい価格を追加します。
株価が重複する可能性があるため、複数の順序セット (C++ のマルチセットなど) をサポートしていない言語では、各株価の出現回数を追加で記録し、追加または追加するときに順序セットを更新することができます。株価の削除 株価の出現回数。残りの操作は、ハッシュ テーブルとソート セットから直接結果を取得できます。
- 最新の株価を返す操作では、最大のタイムスタンプに対応する株価をハッシュテーブルから取得して返します。
- 最高株価を返す操作では、注文されたセットから最高株価である最大値を取得して返します。
- 株価の最低価格を返す操作では、注文されたセットから株式の最低価格である最小値を取得して返します。
3. 問題解決コード
from sortedcontainers import SortedList
class StockPrice:
def __init__(self):
self.prices = SortedList()
self.tpMap = {
}
self.maxTimestamp = 0
def update(self, timestamp: int, prices: int) -> None:
if timestamp in self.tpMap:
self.prices.discard(self.tpMap[timestamp]) # 删除元素
self.prices.add(prices)
self.tpMap[timestamp] = prices
self.maxTimestamp = max(self.maxTimestamp, timestamp)
def current(self) -> int:
return self.tpMap[self.maxTimestamp]
def maximum(self) -> int:
return self.prices[-1]
def minimum(self) -> int:
return self.prices[0]
-
時間計算量:
- 初期化の時間計算量は O(1)、
- 更新操作、株価の最高値を返す操作、および株価の最低価格を返す操作の時間計算量は O(log n)、
- 最新の株価操作を返す時間計算量は O(1)、
- ここで、n は更新操作の数です。
- 更新操作では、最大タイムスタンプ、ハッシュ テーブル、順序セットを更新する必要があります。
- 最大タイムスタンプとハッシュ テーブルの更新には O(1) 時間がかかります。
- ソートセットの更新には O(log n) 時間がかかります。
- 株価の最高値を返す操作と株価の最低値を返す操作は、それぞれ順序集合内の最大値と最小値を検索する必要があり、O(log n) 時間を要します。
- 最新の株価を返す操作では、ハッシュテーブルの最大タイムスタンプに対応する株価を取得する必要があり、O(1)時間がかかります。
-
空間複雑度: O(n)、n は更新操作の数です。空間の複雑さは主にハッシュ テーブルと順序セットに依存し、ハッシュ テーブルと順序セットに格納される要素の数が更新操作の数を超えることはありません。
4. 危険
LeetCode は、プログラマーの技術的成長と企業の技術人材サービスに焦点を当てた LeetCode Network 傘下のブランドです。米国のシリコンバレー発祥の Likou は、世界中のプログラマーにプロフェッショナルな IT テクノロジーのプロフェッショナル向上プラットフォームを提供し、プログラマーが急速な進歩と長期的な成長を達成できるよう効果的に支援します。さらに、LeetCode はプログラマーの技術評価、トレーニング、キャリアマッチングの問題点を解決し、インターネット技術の就職活動と採用の専門化を徐々にリードしていきます。
- 私たちが学んだことによると、簡単な質問と中程度の質問は面接で比較的一般的です。通常、これらは手書きのコードの形式で表示されます。質問を分析して回答し、面接官とコミュニケーションする必要があります。時には分析を求められることもあります時間計算量 8 と空間計算量 °. 面接官は、あなたの分析と質問への回答を基に、一般的に使用されるアルゴリズムに関する知識とプログラム実装スキルを理解します。
- 高度なアルゴリズムやプログラムの実装スキルが求められる職種では、難しい質問も面接官に人気があり、面接中に難しい質問をうまく解決できれば、面接官に多くの印象を残せると考えられます。深い印象を残し、内定を獲得する確率が大幅に高まり、関連する統計によると、面接で難しい質問にうまく答えることができれば、内定を獲得できない確率は限りなく 0 に近づきます。
- したがって、リコウのEasyとMediumは面接の通常の質問に相当し、Hardは面接のより難しい質問に相当し、Hardの質問を解決できれば、オファーはあなたのポケットにあると言えます。
参考
【1】https://leetcode.cn/problems/stock-prices-fluctuation