LeetCode:33. Search in Rotated Sorted Array(Medium)
阿新 • • 發佈:2018-01-04
可能 要求 時間 idt stat ems oid pri 折半查找法
1. 原題鏈接
https://leetcode.com/problems/search-in-rotated-sorted-array/description/
2. 題目要求
給定一個按升序排列的數組nums[ ]和目標值target,將數組在某點處進行旋轉,然後在旋轉後的數組中查找與target相同的元素,存在返回其下標,不存在返回“-1”。
註意:旋轉點未知!
例,{1, 2, 3, 4, 5, 6, 7}旋轉後可能為:
{4, 5, 6, 7,1,2, 3}
{3, 4, 5, 6, 7,1,2}
{6,7,1, 2, 3, 4, 5}
......
3. 解題思路
思路一:暴力解決,遍歷數組進行匹配,時間復雜度為O( n );
思路二:巧妙利用旋轉數組
(1)旋轉數組的性質:旋轉後的數組由兩段按升序排列的數組組成。
(2)先找出旋轉點,旋轉點左右兩邊都是按升序排列的數組;
(3)然後判斷target在旋點的左邊還是右邊:用target和左右兩邊兩個升序數組的最後一位進行比較,即可知道target在哪一邊;
(4)利用折半查找法進行查找。找到返回元素所在下標,否則返回-1。
時間復雜度為O( logn )
例如,target =4 ,旋轉後的數組為{4, 5, 6, 7,1,2, 3},首先找到旋轉點“1”。target = 4>3,所以target =4在左半邊。然後在左半邊進行折半查找,返回查找結果。
4. 代碼實現
1 public class SearchInRotatedSortedArray { 2 public static void main(String[] args) { 3 SearchInRotatedSortedArray si = new SearchInRotatedSortedArray(); 4 int[] nums1 = {}; 5 int[] nums2 = {4, 5, 6, 7, 0, 1, 2}; 6 System.out.println(si.search(nums1, 5));7 System.out.println(si.search(nums2, 5)); 8 } 9 10 public int search(int[] nums, int target) { 11 if (nums.length == 0) return -1; // 數組為空返回 -1 12 int pivot = findMinIdx(nums); 13 if (target == nums[pivot]) return pivot; // target恰好等於旋轉點未知的元素,直接返回 14 int len = nums.length; 15 int start, end; 16 17 /** 18 * 采用二分法進行查找 19 */ 20 if (target > nums[len - 1]) { 21 start = 0; 22 end = pivot; 23 } else { 24 start = pivot; 25 end = len - 1; 26 } 27 28 while (start <= end) { 29 int mid = start + (end - start) / 2; 30 if (nums[mid] == target) return mid; 31 else if (target > nums[mid]) start = mid + 1; 32 else end = mid - 1; 33 } 34 return -1; // 不存在target返回-1 35 } 36 37 // 找出旋轉點 38 public int findMinIdx(int[] nums) { 39 int start = 0, end = nums.length - 1; 40 while (start < end) { 41 int mid = start + (end - start) / 2; 42 if (nums[mid] > nums[end]) 43 start = mid + 1; 44 else end = mid; 45 } 46 return start; 47 } 48 }
運行結果:
LeetCode:33. Search in Rotated Sorted Array(Medium)