2013-07-02 71 views
5

Gần đây tôi đã gặp sự cố lập trình như sau:Để tìm phần tử tối thiểu trong một mảng được sắp xếp và xoay

Một mảng được sắp xếp được cung cấp và mảng được xoay tại một số điểm chưa biết, tôi phải tìm yếu tố tối thiểu trong đó. Mảng cũng có thể chứa các bản sao.

Đối với ví dụ:

Input: {5, 6, 1, 2, 3, 4} 

Output: 1 

Input: {2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2} 

Output: 0 

Tôi đi theo giải pháp đơn giản là để đi qua trough mảng đầy đủ và tìm tối thiểu. Giải pháp này đòi hỏi thời gian O (n) .Tôi hiểu thực tế là yếu tố tối thiểu là phần tử có phần tử trước đó lớn hơn nó. Nếu không có yếu tố như vậy, thì không có vòng quay và phần tử đầu tiên sẽ là tối thiểu.

Nhưng tôi đã được yêu cầu giải pháp O (Đăng nhập). Có cách nào để giải quyết nó trong thời gian O (Logn) không?

+1

nhị phân tìm kiếm này là giải pháp cho 'O (log n)', bạn chỉ cần thêm điều kiện thêm cho quay. –

+1

Bạn có thể kiểm tra liên kết này http://www.geeksforgeeks.org/find-minimum-element-in-a-sorted-and-rotated-array/ – vikiiii

+1

Là một câu hỏi phỏng vấn cho công việc đầu tiên của tôi ngoài đại học. Người phỏng vấn gọi nó là "mảng được phân loại T", nhưng tôi không biết mức độ phổ biến của cụm từ này là ... –

Trả lời

12

Off đỉnh đầu của tôi:

  • Note entry đầu tiên
  • Thực hiện một tìm kiếm nhị phân; ở mỗi giai đoạn, chọn nửa bên phải nếu phần tử trục lớn hơn hoặc bằng phần tử đầu tiên được lưu trữ và nửa bên trái nếu phần tử trục nhỏ hơn.

Ví dụ, cho {4,5,6,7,1,2,3}:

  • Pivot tại 7>4, giảm một nửa đúng {1,2,3}
  • Pivot tại 2 < 4, giảm một nửa trái 1.
  • Chỉ xem xét một phần tử, câu trả lời là 1.
+0

và đối với các bản sao? –

+0

Tại sao nó lại quan trọng nếu có hai chiều, chúng chỉ là min – aaronman

+0

0 là min trong ví dụ trên và không bị trùng lặp. –

1

xem điều này: Vì đó là mảng được sắp xếp. tôi cần phải áp dụng tìm kiếm nhị phân để tìm trục xoay.

Yếu tố thấp nhất sẽ là nơi mảng được xoay vòng.

Gọi findpivot(arr,0,n-1);

int findPivot(int arr[], int low, int high) 
{ 
    // base cases 
    if (high < low) return -1; 
    if (high == low) return low; 

    int mid = (low + high)/2; /*low + (high - low)/2;*/ 
    if (mid < high && arr[mid] > arr[mid + 1]) 
    return mid; 
    if (mid > low && arr[mid] < arr[mid - 1]) 
    return (mid-1); 
    if (arr[low] >= arr[mid]) 
    return findPivot(arr, low, mid-1); 
    else 
    return findPivot(arr, mid + 1, high); 
} 
+2

bài đăng gốc là ở đây: http://www.geeksforgeeks.org/search-an-element-in-a-sorted-and-pivoted-array / –

Các vấn đề liên quan