ในปัญหานี้ เราได้รับ arr[] ขนาด N ที่มีค่าตั้งแต่ 1 ถึง N-1 โดยมีค่าหนึ่งค่าเกิดขึ้นสองครั้งในอาร์เรย์ งานของเราคือ ค้นหาองค์ประกอบที่ทำซ้ำเพียงอย่างเดียวในอาร์เรย์ที่จัดเรียงขนาด n .
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล
arr[] = {1, 2, 3, 4, 5, 5, 6, 7}
ผลผลิต
5
แนวทางการแก้ปัญหา
วิธีง่ายๆ ในการแก้ปัญหาคือการใช้การค้นหาเชิงเส้นและตรวจสอบว่า arr[i] และ arr[i+1] มีค่าเท่ากันหรือไม่ ในกรณีนี้ ให้คืนค่า arr[i] ซึ่งเป็นค่าที่ซ้ำกัน
ตัวอย่างที่ 1
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <iostream> using namespace std; int findRepeatingValueArr(int arr[], int N){ for(int i = 0; i < N; i++){ if(arr[i] == arr[i+1]) return (arr[i]); } return -1; } int main(){ int arr[] = {1, 2, 3, 4, 4, 5, 6}; int N = sizeof(arr)/sizeof(arr[0]); cout<<"The repeating value in the array is "<<findRepeatingValueArr(arr, N); return 0; }
ผลลัพธ์
The repeating value in the array is 4
อีกวิธีในการแก้ปัญหาคือการใช้อัลกอริทึมการค้นหาแบบไบนารีเพื่อค้นหาองค์ประกอบที่เกิดขึ้นสองครั้งที่ดัชนีกลาง หากค่าดัชนีกลางซ้ำแล้วซ้ำอีก ให้พิมพ์ออกมา หากไม่อยู่ที่ตำแหน่งดัชนี ให้ข้ามอาร์เรย์ย่อยด้านขวา มิฉะนั้น ให้ข้ามอาร์เรย์ย่อยด้านซ้าย
ตัวอย่างที่ 2
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <bits/stdc++.h> using namespace std; int findRepeatingValueArr(int arr[], int s, int e){ if (s > e) return -1; int mid = (s + e) / 2; if (arr[mid] != mid + 1){ if (mid > 0 && arr[mid]==arr[mid-1]) return arr[mid]; return arr[findRepeatingValueArr(arr, s, mid-1)]; } return arr[findRepeatingValueArr(arr, mid+1, e)]; } int main(){ int arr[] = {1, 2, 3, 4, 5, 6, 6, 7, 8, 9}; int n = sizeof(arr) / sizeof(arr[0]); cout<<"The repeating value in the array is "<<findRepeatingValueArr(arr, 0, n-1);; return 0; }
ผลลัพธ์
The repeating value in the array is 6