ภาพรวมปัญหา
ได้รับอาร์เรย์จำนวนเต็ม ต้องพิมพ์ค่าที่ไม่ซ้ำกัน (distinct values) ทั้งหมด
ตัวอย่าง
Input: array = {1, 5, 7, 12, 1, 6, 10, 7, 5}
Output: 1 5 7 12 6 10
วิธีแก้ปัญหา 3 แบบ
1. Nested Loops (Simple, O(n²))
ลูปนอกเลือกค่า ลูปในเช็คค่าก่อนหน้า ถ้ายังไม่เคยเจอ → พิมพ์
2. Sorting (O(n log n))
เรียงอาร์เรย์ก่อน ค่าซ้ำจะติดกัน → พิมพ์เฉพาะค่าแรกของแต่ละกลุ่ม
3. Hash Set (O(n) Average)
ใช้ unordered_set ติดตามค่าที่เคยเจอ พิมพ์ตอนเจอครั้งแรก
ตัวอย่างโค้ด C++ (ทั้ง 3 วิธี)
// วิธี 1: Nested Loops
void printDistinctValues(int arr[], int n) {
for (int i = 0; i < n; i++) {
int j;
for (j = 0; j < i; j++)
if (arr[i] == arr[j]) break;
if (i == j) cout << arr[i] << "\t";
}
}
// วิธี 2: Sorting
void printDistinctElements(int arr[], int n) {
sort(arr, arr + n);
for (int i = 0; i < n; i++) {
while (i < n - 1 && arr[i] == arr[i + 1]) i++;
cout << arr[i] << "\t";
}
}
// วิธี 3: Hash Set (แนะนำ)
void printDistinctElements(int arr[], int n) {
unordered_set<int> visited;
for (int i = 0; i < n; i++) {
if (visited.find(arr[i]) == visited.end()) {
visited.insert(arr[i]);
cout << arr[i] << "\t";
}
}
}
ผลลัพธ์ (Output)
Distinct elements of the array are: 1 5 6 7 10 12