使用 C++ 查詢四元組的數量,其中前三個項構成等差數列,後三個項構成等比數列


在本文中,我們將描述找到滿足以下條件的四元組數量的所有可能方法:前 3 項構成等差數列,後 3 項構成等比數列。首先,我們將解釋算術級數 (A.P.) 和幾何級數 (G.P.) 的基本定義。

算術級數 (A.P.) - 這是一個數列,其中公差 (d) 相同或恆定,這意味著兩個連續數字的差是恆定的。例如:1、3、5、7、9 | d = 2

幾何級數 (G.P.) - 這是一個數列,其中公比 (r) 相同,這意味著我們可以透過將前一個數字乘以固定數字來找到每個項。例如:3、6、12、24、... | r = 2

在這個問題中,我們需要確定從 N 個整數的陣列 arr[ ] 中有多少個索引四元組 (a、b、c、d)。因此,arr[a]、arr[b] 和 arr[c] 構成等差數列,而 arr[d]、arr[c] 和 arr[b] 構成等比數列,其中所有四元組都應該是確定的。以下是一個示例 -

Input : arr[ ] = { 9, 6, 4, 2, 1, 2 }
Output : 2
Explanation: Elements in the quadruples are at { 3, 2, 1, 0 } and { 5, 2, 1, 0 } indexes where quadruples are { 2, 4, 6, 9 } for both positions.

Input : arr[ ] = { 2, 6, 1, 4, 2 }
Output : 2
Explanation: Elements in the quadruples are at { 1, 3, 0, 2 } and { 1, 3, 4, 2 } indexes where quadruples are { 6, 4, 2, 1 } for both positions.

解決方法

現在,我們將描述兩種不同的方法來找到解決方案 -

暴力方法

這是一種使用四個巢狀迴圈解決此問題的簡單方法,然後檢查前三個元素是否構成等差數列。如果是,則檢查後三個元素是否構成等比數列。如果是,則將計數變數加 1。但是,這種方法非常耗時,因為它的時間複雜度為 O(n4)

高效方法

在這種方法中,我們首先找到每個陣列元素的計數,然後將兩個元素視為第二個和第三個數字並執行兩個巢狀迴圈,然後第一個元素將是arr[b] – (arr[c] – arr[b]),第四個元素將是arr[c] * arr[c] / arr[b]

示例

#include <bits/stdc++.h>
using namespace std;
int main (){
    unordered_map < int, int >map;
    int arr[] = { 2, 6, 1, 4, 2 };
    int size = sizeof (arr) / sizeof (arr[0]);
    // Processing every elent and increasing the count
    for (int a = 0; a < size; a++)
      map[arr[a]]++;

    int count = 0;
    // Running two nested loops for second & third element
    for (int b = 0; b < size; b++){
        for (int c = 0; c < size; c++){
            if (b == c)
                continue;
                // Decreasing the count
                map[arr[b]]--;
            map[arr[c]]--;
            // Finding the first element using common difference
            int first = arr[b] - (arr[c] - arr[b]);
            // Finding the fourth element using GP
            int fourth = (arr[c] * arr[c]) / arr[b];
            if ((arr[c] * arr[c]) % arr[b] == 0){
                // Increment count if not equal
                if (arr[b] != arr[c])
                    count += map[first] * map[fourth];
                else
                 count += map[first] * (map[fourth] - 1);
            }
            map[arr[b]]++;
            map[arr[c]]++;
        }
    }
    cout <<"Number of quadruples: " << count;
    return 0;
}

輸出

Number of quadruples: 2

以上程式碼的解釋

在此程式碼中,我們使用組合數學,並使用兩個巢狀迴圈來獲取第二個和第三個元素,並使用arr[a] – (arr[c] – arr[b])找到第一個元素,並使用arr[c] * arr[c] / arr[b]找到第四個元素。因此,透過 A 和 B 索引得到的四元組的數量是第一個數字和第四個數字的計數,在保持第二個和第三個元素固定的情況下。此處,上述程式碼的時間複雜度O(n2)

結論

在本文中,我們解決了查詢四元組數量的問題,其中前三個項構成等差數列,後三個項構成等比數列,並且我們討論了兩種使用蠻力 [O(n4)] 和高效方法 [O(n2)] 解決此問題的方法。

我們使用 C++ 解決了此問題,並且可以使用其他各種語言(如 Java、Python、C 或任何其他程式語言)來解決此問題。

更新於:2021 年 11 月 24 日

90 次瀏覽

開啟您的 職業生涯

完成課程獲得認證

開始學習
廣告