กำหนดอาร์เรย์ของตัวเลขที่จัดเรียงโดยมีเพียง 0 และ 1 เท่านั้น ให้ค้นหาจุดเปลี่ยน จุดเปลี่ยนคือดัชนีของ '1' แรกที่ปรากฏในอาร์เรย์ ตัวอย่างเช่น
อินพุต-1 −
N = 6 arr[ ] = {0,0,0,0,1,1}
ผลผลิต −
4
คำอธิบาย − เนื่องจากในอาร์เรย์ที่กำหนดที่มี 0 และ 1 เราจะเห็นว่าองค์ประกอบที่ดัชนี '4' มีตัวเลข '1'
อินพุต-2 −
N = 5 arr[ ] = {0,0,1,1,1}
ผลผลิต −
2
คำอธิบาย − ในอาร์เรย์ที่กำหนดที่มี 0 และ 1 เราจะเห็นว่าองค์ประกอบที่ดัชนี '2' มีตัวเลข '1' ดังนั้นเราจะคืน 2.
แนวทางในการแก้ปัญหานี้
ในอาร์เรย์ของจำนวนเต็มที่กำหนด เราต้องหาดัชนีของ 1 ตัวแรก เพื่อแก้ปัญหานี้ เราสามารถแก้ไขได้โดยใช้ Binary Search Method เพื่อค้นหาดัชนีของ '1' ตัวแรก
-
รับอินพุตอาร์เรย์ของ N Binary Numbers
-
ตอนนี้ฟังก์ชั่น TransitionPoint(int *arr, int n) รับอาร์เรย์เป็นอินพุตและขนาดและส่งคืนดัชนีของ '1' แรกที่ปรากฏในอาร์เรย์
-
ใช้ตัวชี้สองตัวต่ำ สูง ซึ่งเริ่มต้นเป็น '0' และ '1'
-
ตอนนี้เราจะหาจุดกึ่งกลางของอาร์เรย์และจะตรวจสอบว่าเป็น '1' หรือไม่
-
หากตรงกลางของอาร์เรย์คือ '1' เราจะส่งคืนดัชนีของอาร์เรย์ มิฉะนั้นเราจะตรวจสอบโดยดำเนินการต่อไป
-
เพิ่มตัวชี้ต่ำและตรวจสอบอีกครั้งสำหรับ '1'
-
ทำซ้ำขั้นตอนจนกว่าเราจะไม่ได้รับ '1'
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int transitionPoint(int *arr, int n){ int low=0; int high= n-1; while(low<=high){ int mid = (low+high)/2; if(arr[mid]==0) low= mid+1; else if(arr[mid]==1){ if(mid==0 || (mid>0 && arr[mid-1]==0)) return mid; high= mid-1; } } return -1; } int main(){ int n= 6; int arr[n]= {0,0,0,1,1,1}; int ans= transitionPoint(arr,n); if(ans>=0){ cout<<"Transition Point is:"<<ans<<endl; } else{ cout<<"Not Found"<<endl; } return 0; }
ผลลัพธ์
การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น
Transition Point is: 3
อาร์เรย์ที่กำหนด {0,0,0,1,1,1} มีองค์ประกอบ '1' อยู่ที่ดัชนี '3' ดังนั้นเราจึงได้ผลลัพธ์เป็น '3'