C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で解くオンライン株価スパン(Stock Span)問題

ある銘柄の毎日の株価を記録し、その日の「スパン」を返すAPIを考えてみましょう。ここでいう今日の株価のスパンとは、次のように定義されます。

  • 今日から過去にさかのぼって、株価が今日の価格以下であった日が連続して何日続いたかという最大の日数。

例えば、7日間の株価データが [100, 80, 60, 70, 60, 75, 85] だった場合、それぞれの日のスパンは [1, 1, 1, 2, 1, 4, 6] となります。この記事では、このAPIの本体となるモジュールをC++で実装する方法を解説します。

単調スタックを使ったアプローチ

この問題は単調スタック(Monotonic Stack)を使うことで効率的に解けます。各呼び出し時に、現在の価格より小さい過去の価格情報だけをスタックに残すことで、不要な比較を省きます。

アルゴリズムの手順

  1. 2つの配列 st(インデックス用スタック)と v(価格履歴)、およびカウンター counter を用意し、counter を0で初期化します。
  2. next(price) が呼ばれたら、まず counter を1増やします。
  3. スタックが空でなく、かつ price がスタックトップが指す価格以上である間、スタックから要素をポップし続けます。
  4. スタックが空なら ans = counter、そうでなければ ans = counter - スタックトップの値 とします。
  5. 現在の価格を v に追加し、counterst にプッシュします。
  6. ans を返します。

C++での実装例

以下のコードは、上記のアルゴリズムを実際に実装したものです。

#include <bits/stdc++.h>
using namespace std;
class StockSpanner {
   public:
   vector <int> st;
   int counter;
   vector <int> v;
   StockSpanner() {
      counter = 0;
   }
   int next(int price) {
      counter++;
      while(!st.empty() && price >= v[st.back() - 1])st.pop_back();
      int ans = st.empty() ? counter : counter - st.back();
      v.push_back(price);
      st.push_back(counter);
      return ans ;
   }
};
main(){
   StockSpanner ob;
   cout <<(ob.next(100)) << endl;
   cout <<(ob.next(80)) << endl;
   cout <<(ob.next(60)) << endl;
   cout <<(ob.next(70)) << endl;
   cout <<(ob.next(60)) << endl;
   cout <<(ob.next(75)) << endl;
   cout <<(ob.next(85)) << endl;
}

入力

クラスを初期化した後、main() メソッド内で異なる値を引数として next() メソッドを順に呼び出します。

出力

1
1
1
2
1
4
6

計算量について

一見すると next() の中でwhileループを回しているため計算量が心配になりますが、各価格はスタックにプッシュされ、高々1回しかポップされません。したがって、N回の呼び出し全体でO(N)、つまりならし計算量(Amortized Complexity)で1回あたりO(1)となり、非常に効率的な実装です。

  1. LinuxでのC/C++開発におすすめのIDE 6選|特徴と選び方を解説

    テキストエディタだけでは大規模開発は難しい大規模なプロジェクトを単なるテキストエディタだけで管理するのは容易ではありません。そうしたケースでは、IDE(統合開発環境)を活用することで生産性が向上し、ストレスも大幅に軽減されます。IDEにはさまざまな種類があるため、自分のニーズに合ったものを選ぶことが重要です。この記事では、Linuxで利用できるC/C++向けの優れたIDEを6つご紹介します。1. NetBeans(C/C++開発向け)NetBeansは、無料かつオープンソースの人気クロスプラットフォームIDEです。C/C++をはじめ、多くのプログラミング言語に対応しており、コミュニティが開発し

  2. Windowsで使えるC++開発向けおすすめIDE 7選

    ```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe