剣指offerスライドウィンドウの最大値(C++)

4424 ワード

タイトルの説明
配列とスライドウィンドウのサイズを指定し、すべてのスライドウィンドウの数値の最大値を見つけます.例えば、配列{2,3,4,2,6,2,5,1}およびスライドウィンドウのサイズ3を入力すると、合計6つのスライドウィンドウが存在し、それらの最大値はそれぞれ{4,4,6,6,6,6,5}である.配列{2,3,4,2,6,2,5,1}に対するスライド窓は,{[2,3,4],2,6,2,5,1},{3,4,2,5,1},{2,3,[4,2,6],2,5,1},{2,3,4,[2,6,2],5,1},{2,3,4,[2,6,2,5],{2,3,4,2,6,[2,5],{2,5,1},{2,3,4,2,5,{2,5,1}}の6つである
問題を解く構想.
  • という考え方がはっきりしている問題で、何度もデバッグしてやっと合格したが、C++の中の容器部分に対する理解はまだ完全ではないようだ.
  • const vector &numという関数パラメータは、iteratorでは指向できません.反復器を使用する場合は、そのコピーが必要です.
  • max_element(iter, iter + size)は、要素ではなく反復器を返します.要素が必要です.前に*を追加します.
  • 任意の容器の範囲は、左閉右開である.
  • iter != numtemp.end() - size + 1が正しい.iter + size - 1 != numtemp.end()エラー.
  • size > num.size()の場合のみを考慮し、size == 0の場合は考慮しなかった.

  • コード実装
    class Solution {
    public:
        vector<int> maxInWindows(const vector<int>& num, unsigned int size)
        {
            if (size > num.size() or size == 0)
                return{};
            vector<int> ivec, numtemp(num);
            vector<int>::iterator iter = numtemp.begin();
            for (; iter != numtemp.end() - size + 1; iter++)
                ivec.push_back(*max_element(iter, iter + size));
            return ivec;
        }
    };