各kサイズの連続したサブアレイの最大値を見つけるC++プログラム
n個の要素と値kを持つ配列があるとします。サイズkの隣接するサブアレイのそれぞれについて最大値を見つける必要があります。
したがって、入力がarr =[3,4,6,2,8]、k =3の場合、出力は次のようになります。サイズ3の連続するサブ配列は[3,4,6]、[4,6、 2]、[6,2,8]なので、最大要素は6、6、8です。
これを解決するには、次の手順に従います-
- サイズkの両端キューQiを1つ定義します
- iを初期化する場合:=0、i
- Qiが空ではなく、arr [i]> =arr [Qiの最後の要素]の場合、次のようにします。
- Qiから最後の要素を削除する
- Qiの最後にiを挿入
- Qiが空ではなく、arr [i]> =arr [Qiの最後の要素]の場合、次のようにします。
- Qiからフロント要素を削除
- Qiから最後の要素を削除する
例
理解を深めるために、次の実装を見てみましょう-
#include <iostream> #include <vector> #include <deque> using namespace std; int main(){ vector<int> arr = {3,4,6,2,8}; int k = 3; deque<int> Qi(k); int i; for (i = 0; i < k; ++i){ while ( (!Qi.empty()) && arr[i] >= arr[Qi.back()]) Qi.pop_back(); Qi.push_back(i); } for ( ; i < arr.size(); ++i){ cout << arr[Qi.front()] << " "; while ( (!Qi.empty()) && Qi.front() <= i - k) Qi.pop_front(); while ( (!Qi.empty()) && arr[i] >= arr[Qi.back()]) Qi.pop_back(); Qi.push_back(i); } cout << arr[Qi.front()] << endl; }
入力
{3,4,6,2,8}, 3
出力
6 6 8
-
Pythonで最大サブアレイ最小積を見つけるプログラム
配列numsがあるとすると、numsの空でない各サブ配列の最大最小積を見つける必要があります。答えは十分に大きい可能性があるため、10 ^ 9+7を法として返します。配列の最小積は、配列の最小値に配列の合計を掛けたものに等しくなります。したがって、[4,3,6](最小値は3)のような配列がある場合、最小積は3 *(4 + 3 + 6)=3 * 13=39になります。 したがって、入力がnums =[2,3,4,3]のような場合、結果を最大化するためのサブ配列[3,4,3]を取得できるため、出力は30になります。したがって、3 *(3 + 4 + 3)=3 * 10=30。 これを解決するに
-
Pythonで隣接するサブアレイの最大積を見つけるプログラム
numsという配列があるとすると、最大の積を持つ配列(少なくとも1つの数値を含む)内の連続するサブ配列の要素の積を見つける必要があります。したがって、配列が[1,9,2,0,2,5]の場合、連続するサブ配列[1,9,2]の積が最大になるため、出力は18になります。 これを解決するには、次の手順に従います- max_list:=サイズ番号のリスト、0で埋める min_list:=サイズ番号のリスト、0で埋める min_list:=サイズ番号のリスト、0で埋める 1からnumsの長さのiの場合 max_list [i] =max_list [i-1] * nums [i]、min_li