剣指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++の中の容器部分に対する理解はまだ完全ではないようだ. 任意の容器の範囲は、左閉右開である. は
コード実装
配列とスライドウィンドウのサイズを指定し、すべてのスライドウィンドウの数値の最大値を見つけます.例えば、配列{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つである
問題を解く構想.
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;
}
};