Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาองค์ประกอบที่ทำซ้ำเพียงอย่างเดียวในอาร์เรย์ที่จัดเรียงขนาด n โดยใช้ C++


ในปัญหานี้ เราได้รับ 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