題目:
Search in Rotated Sorted Array
Total Accepted: 81090 Total Submissions: 277272 Difficulty: Hard
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
思路:
數組被翻轉,我們以中間元素為核心,把它分為兩種情況,一種情況是中間元素的左邊是有序的,一種是中間元素的右邊是有序的。比如{ 0 1 2 4 5 6 7 }被翻轉為{ 6 7 0 1 2 4 5 }或{ 2 4 5 6 7 0 1 }。
所以每次判斷我們都取輕避重,總是跟有序的這邊比較。
package array;public class SearchInRotatedSortedArray { public int search(int[] nums, int target) { int len = 0; if (nums == null || (len = nums.length) == 0) return 0; // { 0 1 2 4 5 6 7 } // 1. { 6 7 0 1 2 4 5 } // 2. { 2 4 5 6 7 0 1 } int l = 0; int r = len - 1; while (l <= r) { int mid = (l + r) / 2; if (nums[mid] == target) return mid; if (nums[mid] < nums[r]) { if (target > nums[mid] && target <= nums[r]) l = mid + 1; else r = mid - 1; } else { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } } return -1; } public static void main(String[] args) { // TODO Auto-generated method stub int[] nums = { 4, 5, 6, 7, 0, 1, 2 }; SearchInRotatedSortedArray s = new SearchInRotatedSortedArray(); System.out.PRintln(s.search(nums, 2)); }}
新聞熱點
疑難解答