合計がどちらの配列にも存在しない2つの数値を見つけるC++プログラム
問題概要
n個の要素を持つ配列Aと、m個の要素を持つ配列Bが与えられたとします。ここで、Aからある要素aを、Bからある要素bをそれぞれ選び、その合計 a + b が配列AにもBにも存在しないようにする必要があります。
例えば、入力が A = [3, 2, 2]、B = [1, 5, 7, 7, 9] の場合、出力は [3, 9] となります。これは 3 + 9 = 12 がどちらの配列にも存在しないためです(他にも有効な答えは存在します)。
解法のアプローチ
この問題は、非常にシンプルな発想で効率的に解くことができます。ポイントは「各配列の最大値同士を組み合わせる」ことです。すべての要素が正の整数であれば、最大値同士の合計は必ず両方の配列内のどの要素よりも大きくなるため、その合計が配列に含まれることはありません。
具体的には、以下の手順に従います。
配列Aをソートする 配列Bをソートする Aの最後の要素とBの最後の要素を出力する
C++での実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void solve(vector<int> A, vector<int> B) {
sort(A.begin(), A.end());
sort(B.begin(), B.end());
cout << A[A.size() - 1] << ", " << B[B.size() - 1];
}
int main() {
vector<int> A = { 3, 2, 2 };
vector<int> B = { 1, 5, 7, 7, 9 };
solve(A, B);
}入力
{ 3, 2, 2 }, { 1, 5, 7, 7, 9 }出力
3, 9
このアルゴリズムが機能する理由
各配列の最大値をそれぞれa、bとすると、a + b は必ず a および b よりも大きな値になります(要素がすべて正の整数の場合)。したがって、a + b が配列AやBに含まれることはあり得ません。
計算量についても優れており、ソートに O(n log n + m log m)、最大値の取得は O(1) で完了します。全ペアを総当たりで調べる O(n × m) の方法と比べても、はるかに効率的な解法と言えるでしょう。
-
C++で2つの数値を加算するプログラムの書き方【サンプルコード付き】
加算(足し算)は、最も基本的な算術演算の一つです。2つの数値を加算するプログラムは、指定された2つの数値の合計を計算し、その結果を画面に表示します。この記事では、C++で2つの数値を加算する方法を、変数を使った基本例と配列を使った応用例の2パターンに分けて解説します。例1:変数を使って2つの数値を加算するまずは、最もシンプルな方法です。2つの整数型変数を用意し、その合計を別の変数に格納して出力します。#include <iostream> using namespace std; int main() { int num1 = 15, num2 = 10, sum;
-
Pythonでソート済みリストから2つの数の合計がkになるか判定するプログラム
昇順にソートされた数値リスト nums と、別の値 k が与えられているとします。このとき、リストから選んだ2つの要素の合計が k と一致するかどうかを判定する必要があります。要素には負の数や0も含まれる可能性があります。さらに、この問題は定数のメモリ領域(空間計算量 O(1))で解くことが求められます。 例として、nums = [-8, -3, 2, 7, 9]、k = 4 の場合、出力は True になります。これは、7 と -3 を選ぶと 7 + (-3) = 4 となり、k と一致するためです。 解法のアプローチ:二ポインタ法 この問題は「二ポインタ(two-pointer)テクニック