Pertimbangkan tatasusunan yang diisih, sebagai contoh:
[1, 2, 3, 4, 5, 6]
Sekarang, jika tatasusunan ini diputar pada beberapa pangsi, katakan pada indeks 3, ia akan menjadi:
[4, 5, 6, 1, 2, 3]
Perhatikan bahawa tatasusunan masih diisih, tetapi ia dibahagikan kepada dua bahagian. Matlamat kami adalah untuk mencari nilai sasaran dalam tatasusunan sedemikian dengan cekap.
Untuk mencari dalam tatasusunan diisih yang diputar, kita perlu:
class Solution { public static void main(String[] args) { int[] arr = {4, 5, 6, 1, 2, 3}; // Example of rotated sorted array int target = 5; // Searching for the target int result = search(arr, target); // Displaying the result System.out.println("Index of target: " + result); } // Main search function to find the target in a rotated sorted array public static int search(int[] nums, int target) { // Step 1: Find the pivot int pivot = searchPivot(nums); // Step 2: If no pivot, perform regular binary search if (pivot == -1) { return binarySearch(nums, target, 0, nums.length - 1); } // Step 3: If the target is at the pivot, return the pivot index if (nums[pivot] == target) { return pivot; } // Step 4: Decide which half of the array to search if (target >= nums[0]) { return binarySearch(nums, target, 0, pivot - 1); // Search left side } else { return binarySearch(nums, target, pivot + 1, nums.length - 1); // Search right side } } // Binary search helper function static int binarySearch(int[] arr, int target, int start, int end) { while (start <= end) { int mid = start + (end - start) / 2; if (arr[mid] == target) { return mid; // Target found } else if (target < arr[mid]) { end = mid - 1; // Search left half } else { start = mid + 1; // Search right half } } return -1; // Target not found } // Function to find the pivot index in a rotated sorted array static int searchPivot(int[] arr) { int start = 0; int end = arr.length - 1; while (start <= end) { int mid = start + (end - start) / 2; // Check if mid is the pivot point if (mid < end && arr[mid] > arr[mid + 1]) { return mid; } // Check if the pivot is before the mid if (mid > start && arr[mid] < arr[mid - 1]) { return mid - 1; } // Decide whether to move left or right if (arr[mid] <= arr[start]) { end = mid - 1; } else { start = mid + 1; } } return -1; // No pivot found (array is not rotated) } }
cari():
binarySearch():
searchPivot():
Untuk tatasusunan seperti [4, 5, 6, 1, 2, 3]:
Kaedah ini memastikan kami mencari dengan cekap, mencapai kerumitan masa O(log n), serupa dengan carian binari standard.
Tatasusunan diisih yang diputar ialah soalan temu bual biasa dan cabaran yang berguna untuk memperdalam pemahaman anda tentang carian binari. Dengan mencari pangsi dan menyesuaikan carian binari kami dengan sewajarnya, kami boleh mencari dengan cekap melalui tatasusunan dalam masa logaritma.
Jika anda mendapati artikel ini membantu, sila hubungi saya di LinkedIn atau kongsi pendapat anda dalam ulasan! Selamat mengekod!
Atas ialah kandungan terperinci Membina Carian Tatasusunan Diisih Diputar dalam Java: Memahami Carian Pangsi dan Binari. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!