Programers:株価(スタック)


株価



コード#コード#


[私の答え]

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> prices) {
    vector<int> answer;
    for(int i=0;i<prices.size();i++)
    {
        int cnt=0;
        for(int j=i+1;j<prices.size();j++)
        {
            if(prices[i] <= prices[j])
                cnt++;
            else {
                cnt ++;
                break;
            }
        }
        answer.push_back(cnt);
    }
    return answer;
}
  • 直観解法
  • 時間の複雑さは危険に見える
  • O(N^2)よりも効率的にしようとしたが,多くの時間を費やした.
  • [ベストアンサー]

    #include <string>
    #include <vector>
    #include <stack>
    using namespace std;
    
    vector<int> solution(vector<int> prices) {
        vector<int> answer(prices.size());
        stack<int> s;
        for(int i=0;i<prices.size();i++)
        {
            while(!s.empty() && prices[s.top()] > prices[i])
            {
                // 감소가 탐지된 인덱스 ~ 해당 값 까지의 차이만큼은 가격이 떨어지지 않음!
                answer[s.top()] = i - s.top();
                s.pop();
            }
            s.push(i);
        }
        // 감소가 탐지되지 않은 인덱스는 전체 인덱스-1 ~ 해당 인덱스 차이까지 
        while(!s.empty())
        {
            answer[s.top()] = (prices.size()-1) - s.top();
            s.pop();
        }
        return answer;
    }
  • スタックを使用する方法は、より速い解決方法です!
  • 重要なのは、
  • の値ではなくインデックスを使用することです.