C++で合計が偶数となる最大長の部分配列を求める方法
整数型の配列 Arr[] が与えられたとき、要素の合計が偶数となる最長の部分配列の長さを求めるのが本記事の目的です。つまり、部分配列内の要素をすべて足した値が偶数になり、かつその長さが最大となる部分配列を探します。
入力例と出力例
入力 − Arr[] = { 2, 3, 5, 2, 6, 7 }
出力 − 部分配列の最大長:4
説明 − 最大長の部分配列は { 5, 2, 6, 7 } です。合計は 20 となり、偶数になります。
入力 − Arr[] = { 5, 7, 7, 3, 4 }
出力 − 部分配列の最大長:4
説明 − 最大長の部分配列は { 5, 7, 7, 3 } です。合計は 22 となり、偶数になります。
アルゴリズムの考え方
- 整数を格納するために整数型配列 Arr[] を使用します。
- 変数 size には配列の長さを格納します。
- 関数 Length(int arr[]) は配列の合計が偶数であるかどうかを判定します。変数 leng は部分配列の長さを保持します。
- まず配列全体の合計を計算し、それが偶数であれば配列の長さ n をそのまま返します。
- 合計が奇数の場合は、少なくとも1つの奇数要素を除外する必要があります。そこで先頭の要素から順に配列を走査し、奇数の要素 arr[i] が見つかったら、その要素を含まない左側と右側それぞれの部分配列の長さを求めます。
- 最後に、求めた長さの中で最大のものを部分配列の長さとして返します。
この方法のポイントは、配列全体の合計が奇数のとき、奇数要素を1つ取り除けば必ず合計が偶数になるという性質です。したがって、各奇数要素について「その要素より左側」または「その要素より右側」のどちらか長い方を採用すればよいことになります。計算量は O(n) と効率的です。
サンプルコード
#include <iostream>
int Length(int arr[], int n){
int sum = 0, leng = 0;
// 配列全体の合計が偶数の場合
for (int i = 0; i < n; i++)
sum += arr[i];
if (sum % 2 == 0) // 合計がすでに偶数
return n;
// 奇数となる要素 a[i] のインデックス i を探し、
// a[i] を除外した左右それぞれの長さを比較して
// 最大長の部分配列を求める
for (int i = 0; i < n; i++) {
if (arr[i] % 2 == 1)
leng = i > n - i - 1 ? i : n - i - 1;
}
return leng;
}
int main(){
int Arr[] = { 1, 2, 6, 2, 4, 2 };
int size = 6;
printf("Maximum length of subarray such that sum of the subarray is even: %d", Length(Arr, size));
return 0;
}
出力結果
上記のコードを実行すると、次のような出力が得られます −
Maximum length of subarray such that sum of the subarray is even : 5
-
すべての部分配列の合計がk未満となる最大の部分配列サイズを求めるC++プログラム
この記事では、n個の正の整数からなる配列 arr[] と整数 k が与えられたときに、「そのサイズのすべての部分配列の合計が k 未満となる最大の部分配列サイズ」を求めるC++プログラムを紹介します。 問題の概要 配列の要素から構成できるあるサイズの部分配列をすべて考えたとき、どの部分配列を取っても要素の合計が k 以下になるような、最大のサイズを見つけるのが目標です。 具体例で理解しよう 入力 arr[n] = {4, 1, 3, 2}, k = 9 出力 3 説明 サイズ3の部分配列とその合計は次のようになります。 {4, 1, 3} = 8 {1, 3, 2} = 6 サイズ3のすべての
-
【C++】部分木がBSTでもある二分木における最大部分木合計の求め方
問題概要 この問題では、二分木 BT が与えられ、「その部分木自身も二分探索木(BST)である」という条件を満たす部分木の中から、ノード値の合計が最大となるものを見つけるプログラムを作成します。 二分木(Binary Tree)とは 二分木とは、各ノードが最大2つの子ノードを持つことができる特殊な木構造です。 二分探索木(BST)とは 二分探索木とは、すべてのノードが以下の性質を満たす木のことです。 左部分木のキー値は、親(ルート)ノードのキー値より小さい。 右部分木のキー値は、親(ルート)ノードのキー値以上である。 入出力例 入力: 出力: 32 説明:この木には BST として成立し