1. 程式人生 > >LeetCode:33. Search in Rotated Sorted Array(Medium)

LeetCode:33. Search in Rotated Sorted Array(Medium)

可能 要求 時間 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)