ในบทความนี้ เราจะอธิบายทุกวิธีที่เป็นไปได้ในการค้นหาจำนวนสี่เท่าโดยที่ 3 คำแรกอยู่ใน A.P. และ 3 คำสุดท้ายอยู่ใน G.P. อันดับแรก เราจะอธิบายคำจำกัดความพื้นฐานของความก้าวหน้าทางคณิตศาสตร์ (A.P.) และความก้าวหน้าทางเรขาคณิต (G.P.)
ความก้าวหน้าทางคณิตศาสตร์ (A.P.) − เป็นลำดับของตัวเลขโดยที่ผลต่างร่วม (d) มีค่าเท่ากันหรือคงที่ ซึ่งหมายความว่าผลต่างของตัวเลขสองตัวติดต่อกันเป็นค่าคงที่ ตัวอย่างเช่น:1,3,5,7,9 | d =2
ความก้าวหน้าทางเรขาคณิต (GP) − เป็นลำดับของตัวเลขที่มีอัตราส่วนร่วม (r) เท่ากัน ซึ่งหมายความว่าเราสามารถหาแต่ละพจน์ได้โดยการคูณตัวเลขก่อนหน้าด้วยจำนวนคงที่ ตัวอย่างเช่น 3, 6, 12, 24,.... | r =2
ในปัญหานี้ เราจำเป็นต้องกำหนดจำนวนดัชนีสี่เท่า (a, b, c, d) จากอาร์เรย์ arr[ ] ของจำนวนเต็ม N เป็นผลให้ arr[a], arr[b] และ arr[c] อยู่ใน A.P. และ arr[d], arr[c] และ arr[b] อยู่ใน G.P. โดยที่สี่เท่าทั้งหมดควรจะแน่นอน นี่คือตัวอย่าง −
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. แนวทางในการหาแนวทางแก้ไข
ตอนนี้ เราจะอธิบายสองวิธีที่แตกต่างกันเพื่อค้นหาวิธีแก้ปัญหา -
แนวทางกำลังเดรัจฉาน
เป็นแนวทางง่ายๆ ในการแก้ปัญหานี้โดยใช้ลูปที่ซ้อนกันสี่อัน จากนั้นตรวจสอบว่าองค์ประกอบสามรายการแรกอยู่ใน A.P หรือไม่ ถ้าใช่ ให้ตรวจสอบว่าองค์ประกอบ 3 รายการสุดท้ายอยู่ใน G.P หรือไม่ ถ้าใช่ ให้เพิ่มตัวแปรการนับขึ้น 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
คำอธิบายของโค้ดด้านบน
ในโค้ดนี้ เราใช้ Combinatorics และใช้ลูปซ้อนสองลูปสำหรับองค์ประกอบที่สองและสาม และค้นหาองค์ประกอบแรกด้วย arr[a] – (arr[c] – arr[b]) และองค์ประกอบที่สี่ด้วย arr[c] * arr[c] / arr[b] . ดังนั้นจำนวนของสี่เท่าโดยดัชนี A และ B คือการนับของตัวเลขแรก * ตัวเลขที่สี่ โดยคงองค์ประกอบที่สองและสามคงที่ ความซับซ้อนของเวลา ของโค้ดด้านบนคือ O(n2) .
บทสรุป
ในบทความนี้ เราแก้ปัญหาการหา Number of quadruples โดยที่คำศัพท์สามคำแรกอยู่ใน AP และสามเทอมสุดท้ายอยู่ใน GP และเราพูดถึงสองแนวทางในการแก้ปัญหานี้โดยใช้ Bruteforce[ O(n4) ] และ Efficient เข้าใกล้ [ O(n2) ].
เราแก้ไขปัญหานี้โดยใช้ C++ และสามารถแก้ปัญหานี้ในภาษาอื่นๆ เช่น java, python, C หรือภาษาการเขียนโปรแกรมอื่นๆ