C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で配列の最小値と2番目に小さい値の最大合計を求める方法

本チュートリアルでは、配列内の「最小値」と「2番目に小さい値」の合計の最大値を求めるC++プログラムについて解説します。

問題の概要

整数の配列が与えられたとき、考えられるすべての部分配列(連続する要素の組み合わせ)の中から、それぞれの部分配列における最小値と2番目に小さい値の合計を計算し、その中で最も大きくなる値を見つけることが課題です。

解法のポイント

一見するとすべての部分配列を調べる必要があるように思えますが、実は隣接する2要素のペアだけを確認すれば十分です。部分配列が長くなるほど、その中の最小値や2番目に小さい値は小さくなる(または変わらない)傾向があるため、隣接ペアの合計を超えることはないからです。

つまり、この問題は「隣接する要素同士の和の最大値を求める問題」に帰着できます。

サンプルコード

#include <bits/stdc++.h>
using namespace std;

// 最小値と2番目に小さい値の最大合計を返す関数
int pairWithMaxSum(int arr[], int N) {
    // 要素が2つ未満の場合はペアが存在しないため -1 を返す
    if (N < 2)
        return -1;
    int res = arr[0] + arr[1];
    for (int i = 1; i < N - 1; i++)
        res = max(res, arr[i] + arr[i + 1]);
    return res;
}

int main() {
    int arr[] = {4, 3, 1, 5, 6};
    int N = sizeof(arr) / sizeof(int);
    cout << pairWithMaxSum(arr, N) << endl;
    return 0;
}

出力

11

コードの解説

まず、配列の要素数が2未満の場合はペアが作れないため -1 を返します。初期値として最初の2要素の合計を設定し、その後ループで隣接する各ペアの合計を順に比較しながら最大値を更新していきます。

例として配列 {4, 3, 1, 5, 6} の場合、隣接ペアの合計はそれぞれ「4+3=7」「3+1=4」「1+5=6」「5+6=11」となり、最大値は 11 です。

このアルゴリズムの計算量は O(N) と非常に効率的で、配列を一度走査するだけで答えが得られる点が大きなメリットです。

  1. 【C++】分割統治法で最大部分配列和を求める方法を解説

    正の値と負の値が混在する数列が与えられたとき、その中から「要素が連続する部分配列(サブアレイ)」のうち合計が最大になるものを求める問題を考えます。例えば、数列 {-2, -5, 6, -2, -3, 1, 5, -6} の場合、最大部分配列和は 7 となり、これは {6, -2, -3, 1, 5} の合計に相当します。この問題は、分割統治法(Divide and Conquer)を用いることで効率的に解くことができます。アルゴリズムの手順配列を中央で2つに分割する以下の3つの値のうち最大のものを求める左側の部分配列における最大部分配列和右側の部分配列における最大部分配列和中央をまたいで(左右

  2. C++の配列パズル:減算演算子を使わずに「自分以外の要素の合計」を求める方法

    今回は、配列に関する興味深い問題を紹介します。n個の要素を持つ配列が与えられ、それをもとに同じくn個の要素を持つ別の配列を作成します。ただし、新しい配列のi番目には、元の配列のi番目の要素を除いたすべての要素の合計を格納します。さらに重要な制約として、減算演算子(-)を使用してはいけないという条件が課されています。 問題のポイント もし減算が使えるのであれば、話は簡単です。まず全要素の合計を求めておき、そこからi番目の要素を引いた値を新しい配列のi番目に格納すればよいだけです。しかし、この問題では減算が禁止されているため、別のアプローチが必要になります。 そこで、各位置i(0〜n-1)について