使用 C++ 找出前三项在 AP 中,后三项在 GP 中的四元组数
在这篇文章中,我们将描述寻找前3项在AP中,后3项在GP中的四元组个数的所有可能方法首先,我们将解释等差数列(AP)和等比数列的基本定义(GP)。
算术级数(AP)-它是一个数字序列,其中的公差(d)相同或恒定,这意味着两个连续数字的差异是恒定的。例如:1,3,5,7,9|d=2
GeometricProgression(GP)-它是一个数字序列,其中的公比(r)相同,这意味着我们可以通过将前一个数字与固定数字相乘来找到每一项。例如:3,6,12,24,....|r=2
在这个问题中,我们需要确定quadruples(a,b,c,d)N个整数的数组arr[]有多少个索引。因此,arr[a]、arr[b]和arr[c]在AP中,而arr[d]、arr[c]和arr[b]在GP中,其中所有四元组都应该是确定的。所以这是例子-
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.
寻找解决方案的方法
现在,我们将描述两种不同的方法来找到解决方案-
蛮力方法
解决这个问题的一个简单的方法是使用四个嵌套循环,然后检查前三个元素是否在AP中,如果是,则检查后3个元素是否在G.P。如果是,则将count变量增加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]); //处理每个元素并增加计数 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; //减少计数 map[arr[b]]--; map[arr[c]]--; //使用共同差异找到第一个元素 int first = arr[b] - (arr[c] - arr[b]); //使用GP查找第四个元素 int fourth = (arr[c] * arr[c]) / arr[b]; if ((arr[c] * arr[c]) % arr[b] == 0){ //如果不相等则增加计数 if (arr[b] != arr[c]) count += map[first] * map[fourth]; else count += map[first] * (map[fourth] - 1); } map[arr[b]]++; map[arr[c]]++; } } cout <<"四元组数: " << count; return 0; }输出结果
四元组数: 2
以上代码说明
在此代码中,我们使用组合数学,并为第二个和第三个元素使用两个嵌套循环,并使用arr[a]–(arr[c]–arr[b])查找第一个元素和使用arr[c]*arr[c]/arr[b]。因此,通过保持第二个和第三个元素固定,A和B索引的四元组的数量是第一个数字*第四个数字的计数。这里上面代码的时间复杂度是O(n2)。
结论
在本文中,我们解决了前三项在AP中,后三项在GP中的四元组数的问题,我们讨论了使用Bruteforce[O(n4)]和Efficient两种方法来解决这个问题接近[O(n2)]。
我们使用C++解决了这个问题,这可以用其他各种语言(如java、python、C或任何其他编程语言)来解决这个问题。