28.earch in Rotated Sorted Array(排序旋轉數組中查找)
阿新 • • 發佈:2019-04-30
題目 arch runtime urn sts must bin num arr
Level:
??Medium
題目描述:
Suppose an array sorted in ascending order 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.
Your algorithm‘s runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1
思路分析:
??有序旋轉數組,設置兩個指針,left和right,分別指向數組的左端和右端,求數組的mid,如果mid的值大於left的值,那麽旋轉點在mid後面,如果小於left,則證明旋轉點在mid前面。
??如果旋點在mid的後面,並且target的值大於left處的值,小於mid處的值,那麽接下來就可以在left到mid之間進行二分查找target,否則對mid+1到right這部分數組進行遞歸操作。
??如果旋點在mid的前面,並且target的值大於mid處的值,小於right處的值,那麽接下來就可以在mid到right之間進行二分查找target,否則對left到mid-1這部分數組進行遞歸操作。
代碼:
public class Solution{ public int search(int []nums,int target){ if(nums==null||nums.length==0) return -1; int res=find(nums,0,nums.length-1,target); return res; } public int find(int []nums,int left,int right,int target){ if(nums[left]==target) return left; if(nums[right]==target) return right; int mid=(left+right)/2; if(nums[mid]==target) return mid; if(left>right) return -1; if(nums[mid]>nums[left]){ //證明旋轉點在mid後面 if(target>nums[left]&&target<nums[mid]){ return binarySearch(nums,left,mid-1,target); }else{ return find(nums,mid+1,right,target); } } if(nums[mid]<nums[left]){ //證明旋轉點在mid的前面 if(target>nums[mid]&&target<nums[right]){ return binarySearch(nums,mid+1,right,target); }else{ return find(nums,left,mid-1,target); } } return -1; } public int binarySearch(int []nums,int left,int right,int target){ if(left<=right){ int mid=(left+right)/2; if(nums[mid]==target) return mid; if(target>nums[mid]){ return binarySearch(nums,mid+1,right,target); } if(target<nums[mid]){ return binarySearch(nums,left,mid-1,target); } } return -1; } }
28.earch in Rotated Sorted Array(排序旋轉數組中查找)