Một vài ngày trước, trong một cuộc phỏng vấn, tôi được hỏi một chương trình tìm phần tử trùng lặp trong một dãy số nguyên liên tiếp trong thời gian O(log n)
.Tìm phần tử trùng lặp trong một mảng các số nguyên liên tiếp trong thời gian O (log n)
Trường hợp hơi cụ thể, vì có tổng cộng 11 số nguyên (1 đến 10, theo thứ tự) đó, một bản sao của bất kỳ số nào trong số này được chèn vào đâu đó ở giữa.
tôi đã được đưa ra một mẫu tương tự như sau:
{1, 2, 3, 4, 5, 6, , 7, 8, 9, 10}
Vì vậy, bây giờ tôi đã đưa ra mã C sau:
#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;
}
Điều này có đáp ứng đúng tiêu chuẩn O(log n)
không? Và, có bất kỳ lựa chọn thay thế/cải tiến nào về điều này không?
Mẹo: Luôn sử dụng khoảng thời gian nửa mở. BTW: Còn về những con số ma thuật trong con chim khác thì sao? – Deduplicator