เราได้รับอาเรย์ที่มีสมาชิกจำนวนเต็ม เป้าหมายคือหาคู่ที่ไม่ซ้ำของสมาชิกอาเรย์ที่คู่แบบ (arr[i],arr[j]) มีดัชนีที่ i < j
มาดูตัวอย่าง
อินพุต − arr[] = {1,2,3};
เอาต์พุต − จำนวนคู่ที่ไม่ซ้ำ (arr[i], arr[j]) ที่ i < j คือ 3
คำอธิบาย − เนื่องจากทุกสมาชิกไม่ซ้ำ คู่จะเป็น −
(1,2) - ( arr[0],arr[1] ) 0<1 (1,3) - ( arr[0], arr[2] ) 0<2 (2,3) - ( arr[1],arr[2] ) 1<2
อินพุต − arr[] = { 4,4,3,2 };
เอาต์พุต − จำนวนคู่ที่ไม่ซ้ำ (arr[i], arr[j]) ที่ i < j คือ 4
คำอธิบาย − เนื่องจากสมาชิกไม่ซ้ำ คู่จะเป็น −
(4,4) - ( arr[0],arr[1] ) 0<1 (4,3) - ( arr[0], arr[2] ) 0<2 (4,2) - ( arr[0],arr[3] ) 0<3 (3,2) - ( arr[2],arr[3] ) 2<3
แนวทางที่ใช้ในโปรแกรม
เราจะใช้สองวิธี วิธีแรกแบบง่ายด้วยลูป FOR เริ่มเดินทางอาเรย์ arr[] ด้วยลูป FOR สองชั้น จาก i=0 ถึง i<length-1 และ j=i+1 ถึง j<length ด้วยวิธีนี้จะมี i<j เสมอ ตอนนี้เพิ่มคู่ (arr[i],arr[j]) เข้า set<pair<int, int>> se ท้ายสุดขนาดของ se จะเป็นจำนวนคู่ที่ไม่ซ้ำที่มี i<j
- รับอาเรย์จำนวนเต็ม
arr[]พร้อมขนาดsize - ฟังก์ชัน
unique_pair(int arr[], int size)รับอาเรย์และความยาว คืนจำนวนคู่ที่ไม่ซ้ำที่ในคู่(arr[i],arr[j])ดัชนีi<j - กำหนดค่าเริ่มต้นของ
countเป็น 0 - สร้างเซต
seที่มีคู่จำนวนเต็ม(set<pair<int, int>> se) - เริ่มเดินทาง
arr[]ด้วยลูป FOR สองชั้น จากi=0ถึงi<size-1และj=i+1ถึงj<size - สำหรับแต่ละคู่ที่มี
i<jเพิ่มคู่(arr[i],arr[j])เข้าseด้วยse.insert(make_pair(arr[i], arr[j])) - ท้ายสุดของลูป FOR ทั้งสอง อัปเดต
count=se.size() countตอนนี้มีจำนวนคู่ในse(ทั้งหมดไม่ซ้ำ)- คืน
count
แนวทางที่มีประสิทธิภาพ
ในแนวทางนี้ เราจะหาสมาชิกที่ไม่ซ้ำหลังจากแต่ละสมาชิก arr[i] จะจับคู่กับสมาชิกที่แตกต่าง/ไม่ซ้ำจาก arr[i+1 ถึง size-1] ดังนั้นถ้ามี x สมาชิกไม่ซ้ำหลัง arr[i] แล้ว arr[i] จะสร้าง x คู่ เราจะสร้างอาเรย์ทำเครื่องหมายสมาชิกไม่ซ้ำหลังดัชนี i แล้วบวกจำนวนแต่ละอันเพื่อคู่ไม่ซ้ำรวม
- รับอาเรย์จำนวนเต็ม
arr[]พร้อมความยาวsize - ฟังก์ชัน
unique_pair(int arr[], int size)รับอาเรย์และความยาว คืนจำนวนคู่ที่ไม่ซ้ำที่ในคู่(arr[i],arr[j])ดัชนีi<j - กำหนดค่าเริ่มต้นของ
countเป็น 0 - ตัวแปร
tempกำหนดเป็น 0 - สร้างอาเรย์
arr_2[]ความยาวsizeเริ่มต้นarr_2[size-1]=0เพราะสมาชิกสุดท้ายมี 0 สมาชิกไม่ซ้ำหลังมัน - สร้างเซตจำนวนเต็มสองตัว
checkและuncheck - เดินทางอาเรย์จากสมาชิกสุดท้ายถึงแรก
i=size-1ถึงi>=0ค้นหาarr[i]ในเซตcheck - ถ้าไม่เจอ แสดงว่าไม่ซ้ำ เพิ่ม
temp(tempคือจำนวนสมาชิกไม่ซ้ำหลังarr[i]) กำหนดarr_2[i]=temp - มิฉะนั้น
arr_2[i]=tempโดยไม่เพิ่มtemp - เพิ่ม
arr[i]เข้าเซตcheckตอนนี้การเกิดครั้งต่อไปของarr[i]จะไม่ถูกนับ - ท้ายสุดของลูป FOR นี้
arr_2[]ถูกอัปเดต - ตอนนี้เดินทาง
arr[]จากดัชนีi=0ถึงi<size-1สำหรับทุกarr[i]ตรวจสอบว่าอยู่ในเซตuncheckถ้าไม่ได้ แสดงว่าarr[i]เกิดครั้งแรก บวกarr_2[i](สมาชิกไม่ซ้ำหลังarr[i]) เข้าcountมิฉะนั้นไม่ทำอะไรต่อ - เพิ่ม
arr[i]เข้าเซตuncheckการเกิดครั้งต่อไปจะไม่ถูกนับ - ท้ายสุด
countมีคู่ไม่ซ้ำที่i<jสำหรับคู่ไม่ซ้ำ(arr[i],arr[j]) - คืน
count
ตัวอย่าง (วิธีง่าย)
#include<bits/stdc++.h>
using namespace std;
int unique_pair(int arr[], int size){
int count = 0;
set<pair<int, int>> se;
for(int i = 0; i < (size - 1); i++){
for (int j = i + 1; j < size; j++){
se.insert(make_pair(arr[i], arr[j]));
}
}
count = se.size();
return count;
}
int main(){
int arr[] = { 4, 3, 1, 6, 7 };
int size = sizeof(arr) / sizeof(arr[0]);
cout<<"Count of unique pairs (arr[i], arr[j]) such that i < j are: "<<unique_pair(arr, size);
return 0;
}
เอาต์พุต
หากรันโค้ดด้านบนจะได้ผลลัพธ์ดังนี้ −
Count of unique pairs (arr[i], arr[j]) such that i & j are: 10
ตัวอย่าง (แนวทางมีประสิทธิภาพ)
#include<bits/stdc++.h>
using namespace std;
int unique_pair(int arr[], int size){
int count = 0, temp = 0;
int arr_2[size];
arr_2[size-1] = 0;
set<int> check, uncheck;
for (int i = size - 1; i > 0; i--){
auto set = check.find(arr[i]);
if (set != check.end()){
arr_2[i - 1] = temp;
} else {
arr_2[i - 1] = ++temp;
}
check.insert(arr[i]);
}
for (int i = 0; i < size - 1; i++){
auto set = uncheck.find(arr[i]);
if (set != uncheck.end()){
continue;
}
count += arr_2[i];
uncheck.insert(arr[i]);
}
return count;
}
int main(){
int arr[] = { 4, 3, 1, 6, 7 };
int size = sizeof(arr)/sizeof(arr[0]);
cout<<"Count of unique pairs (arr[i], arr[j]) such that i < j are: "<<unique_pair(arr, size);
return 0;
}
เอาต์พุต
หากรันโค้ดด้านบนจะได้ผลลัพธ์ดังนี้ −
Count of unique pairs (arr[i], arr[j]) such that i < j are: 10