कुछ दिन पहले, एक साक्षात्कार में मुझे एक ऐसे कार्यक्रम के लिए कहा गया था जिसमें O(log n)
समय में लगातार पूर्णांक सरणी में एकल डुप्लिकेट तत्व मिलेगा ।ओ (लॉग एन) समय में लगातार पूर्णांक की सरणी में डुप्लिकेट तत्व पाएं
मामला कुछ हद तक विशिष्ट है, क्योंकि कुल 11 पूर्णांक (1 से 10, उस क्रम में) प्लस, इनमें से किसी भी संख्या का एक डुप्लिकेट, बीच में कहीं भी डाला गया है।
मैं एक नमूना इस के समान दिया गया था:
{1, 2, 3, 4, 5, 6, , 7, 8, 9, 10}
#include <stdio.h>
int main (void)
{
int a[11] = {1, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10}, first=0, last=10, mid;
while (1)
{
mid = (first + last)/2;
if (mid+1 == a[mid])
first = mid+1;
else if ((mid == 0) || (mid == 10) || (a[mid+1] - a[mid-1] == 1)) /* Order is Important, (a[mid+1] - a[mid-1] == 1) must be last */
break;
else
last = mid-1;
}
printf("Duplicate element is %d, located at position no. %d.", a[mid], mid+1);
return 0;
}
इस ठीक से O(log n)
मानदंडों को पूरा करेंगे: तो, अब मैं निम्नलिखित सी कोड के साथ आ गया है? और, क्या इस पर कोई विकल्प/सुधार हैं?
एक टिप: हमेशा आधा खुला अंतराल का उपयोग करें। बीटीडब्ल्यू: elseif-brnch में उन जादू संख्याओं के बारे में क्या? – Deduplicator