Mô tả
Cho một mảng được sắp xếp gồm các phần tử riêng biệt được xoay vòng tại một số điểm không xác định, nhiệm vụ là tìm phần tử lớn nhất trong đó.
Ví dụ
Nếu mảng đầu vào là {30, 40, 50, 10, 20} thì phần tử tối đa là 50.
Thuật toán
- Phần tử tối đa là phần tử duy nhất có phần tử tiếp theo nhỏ hơn phần tử đó. Nếu không có phần tử nhỏ hơn tiếp theo, thì không có vòng quay, tức là phần tử cuối cùng là phần tử lớn nhất
- Chúng tôi kiểm tra điều kiện này cho phần tử ở giữa bằng cách so sánh nó với các phần tử ở giữa - 1 và giữa + 1. Nếu phần tử tối đa có các phần tử ở giữa - 1 và giữa + 1. Nếu phần tử tối đa không ở giữa (không phải giữa cũng không giữa + 1), thì gia tốc tối đa nằm ở nửa trái hoặc nửa phải -
- Nếu phần tử ở giữa lớn hơn phần tử cuối cùng, thì phần tử lớn nhất nằm ở nửa bên trái
- Phần tử cực đại khác nằm ở nửa bên phải
Ví dụ
#include <bits/stdc++.h> using namespace std; int getMaxinSortedAndRorated(int *arr, int lont high) { if (high < low) { return arr[0]; } if (high == low) { return arr[high]; } int mid = low + (high - low) / 2; if (mid < high && arr[mid + 1] < arr[) { return arr[mid]; } if (mid > low && arr[mid] < arr[mid - { return arr[mid - 1]; } if (arr[low] > arr[mid]) { return getMaxinSortedAndRoratrr, low, mid - 1); } else { return getMaxinSortedAndRoratrr, mid + 1, high); } } int main() { int arr[] = {30, 40, 50, 10, 20}; int n = sizeof(arr) / sizeof(arr[0]); cout << "Maximum element = " << getMaortedAndRorated(arr, 0, n - 1) << endl; return 0; }
Đầu ra
Khi bạn biên dịch và thực thi chương trình trên. Nó tạo ra kết quả sau -
Maximum element = 5