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

C++で積が指定した値に等しくなる2つの連結リストのペアを数える方法

2つの連結リストが与えられ、それぞれのリストが持つ整数要素を組み合わせて、その積が指定された値(k)と等しくなるペアがいくつ存在するかを求めるのが課題です。連結リスト(リンクリスト)とは、リンク(ポインタ)によって順々に接続されたデータ構造の列のことを指します。

入力例と出力例

例1

入力:

vector v_1 = {5, 7, 8, 10, 11}
vector v_2 = {6, 4, 3, 2, 0}
int k = 20

出力:

積が指定された値kに等しい2つの連結リストのペアの数: 2

説明:

2つの連結リストから作成できるペアは全部で 5 × 5 = 25通りあります。そのうち積が20と等しくなるのは、(5, 4) = 20 と (10, 2) = 20 の2通りだけです。したがって、条件を満たすペアの数は2となります。

例2

入力:

vector v_1 = {2, 3, 5, 6}
vector v_2 = {6, 4, 3}
int k = 9

出力:

積が指定された値kに等しい2つの連結リストのペアの数: 1

説明:

作成できるペアは全部で 4 × 3 = 12通りあります。そのうち積が9と等しくなるのは (3, 3) = 9 の1通りだけです。したがって、条件を満たすペアの数は1となります。

プログラムで使用するアプローチ

  • kの値と整数型の値を2つのvectorに入力し、これらのベクトルから連結リストを構築できるようにします。

  • 引数として渡されたvectorをもとに連結リストを作成する関数を作成します。

    • vectorのサイズ分だけループを回し、ListNodeクラスのポインタオブジェクトを作成します。

    • ptr->nextがNULLでなくなる間、ptrをptr->nextに進めてリストの末尾を探します。

    • 末尾のptr->nextに新しいListNode(vector[i])を接続します。

    • 先頭ポインタstartを返します。

  • 指定された積に一致するペアの個数を返す関数を作成します。

    • 一時変数countを宣言し、0で初期化します。

    • 2つのポインタオブジェクト、すなわち1つ目の連結リスト用の*first_listと、2つ目の連結リスト用の*second_listを用意します。

    • 1つ目のリストの先頭ポインタから、リストが空になるまで外側のループを実行します。

    • そのループ内で、2つ目のリストの先頭ポインタから、リストが空になるまで内側のループを実行します。

    • ループ内で (first_list->data * second_list->data) == k が成り立つかどうかを判定し、成り立てばcountを1増やします。

    • countを返します。

  • 結果を出力します。

サンプルコード

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

class ListNode {
public:
    int data;
    ListNode *next;
    ListNode(int data) {
        this->data = data;
        next = NULL;
    }
};

ListNode *CreateList(vector<int> v) {
    ListNode *start = new ListNode(v[0]);
    for (int i = 1; i < v.size(); i++) {
        ListNode *ptr = start;
        while (ptr->next != NULL) {
            ptr = ptr->next;
        }
        ptr->next = new ListNode(v[i]);
    }
    return start;
}

int product_pair(ListNode *start_1, ListNode *start_2, int k) {
    int count = 0;
    ListNode *first_list, *second_list;
    for (first_list = start_1; first_list != NULL; first_list = first_list->next) {
        for (second_list = start_2; second_list != NULL; second_list = second_list->next) {
            if ((first_list->data * second_list->data) == k) {
                count++;
            }
        }
    }
    return count;
}

int main() {
    vector<int> v_1 = {5, 7, 8, 10, 11};
    ListNode* start_1 = CreateList(v_1);
    vector<int> v_2 = {6, 4, 3, 2, 0};
    ListNode* start_2 = CreateList(v_2);
    int k = 30;
    cout << "積が指定された値kに等しい2つの連結リストのペアの数: " << product_pair(start_1, start_2, k);
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

積が指定された値kに等しい2つの連結リストのペアの数: 2

計算量

このアプローチでは、1つ目のリストの各要素に対して2つ目のリストの全要素を順に調べるため、時間計算量はO(N×M)(N・Mはそれぞれのリストの長さ)となります。一方、追加のデータ構造を使用しないため、空間計算量はO(1)です。

  1. ソート済み双方向連結リストで積が指定値xと等しくなるトリプルの個数を数えるC++プログラム

    問題の概要 整数値を格納したソート済みの双方向連結リスト(doubly linked list)が与えられます。この課題の目標は、3つのノードのデータの積が指定された値xと等しくなるようなトリプル(三つ組)の個数を求めることです。 例えば、入力リンクリストが「3→4→1→2」でxが6の場合、積が6になるトリプルは(3, 1, 2)の1つだけなので、カウントは1となります。 入力例と出力例 例1 入力: linked list: [ 200→4→16→5→10→10→2 ]、x = 200 出力: 積が指定値xと等しくなるトリプルの個数: 3 説明: 該当するトリプルは以下の3つです。 (4

  2. C++で2つのBSTから合計が指定値xと等しいペアを数える方法

    2つの二分探索木(BST)と整数値 x が与えられます。この記事の目的は、BST_1 から1つのノード、BST_2 からもう1つのノードを選んだペアのうち、両ノードの値の合計が x に一致するものの個数を求めることです。具体的には、BST_1 のノードと BST_2 のノードのデータ部分を加算し、その合計が x と等しければカウントを1つ増やしていきます。具体例で確認してみましょう。入力出力 − 合計が指定値 x に等しい2つのBSTからのペアの数 − 1説明 − 該当するペアは (8, 6) です。入力出力 − 合計が指定値 x に等しい2つのBSTからのペアの数 − 2説明 − 該当するペ