[leetcode ]Search in Rotated Sorted Array
阿新 • • 發佈:2019-01-02
題目: Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become
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.
(i.e., 0 1 2 4 5 6 7 might become
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.
思路: 二分查詢,
需要先判斷是那種情況,然後針對兩種情況分別處理:
1 first <mid 4 5 6 7 8 0 1 2 3.
2 first > mid 6 7 8 0 1 2 3 4 5.
Java 程式碼:
//二分查詢 public static int binarySearch(int[] data, int target){ int first = 0; int last = data.length - 1; int mid = (first + last )/2; while(first != last){ if(data[mid] == target) return mid; if(data[first] < data[mid] ) //e.x. 4 5 6 7 8 0 1 2 3. { if(data[first]< target && target< data[mid]) //left { last = mid; }else{ first= mid+1; } }else { //e.x. 6 7 8 0 1 2 3 4 5. if(data[mid]< target && target< data[last]) //right { first= mid+1; }else{ last = mid; } } mid = (first+ last)/2; //更新mid的值 } return -1 ; }
更進一步:
Follow up for ”Search in Rotated Sorted Array”: What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
考慮first和mid值相等的情況
public static int binarySearchForDuplicated(int[] data, int target){ int first = 0; int last = data.length - 1; int mid = (first + last )/2; while(first != last){ if(data[mid] == target) return mid; if(data[first] < data[mid] ) //e.x. 1 2 3 0 1 { if(data[first]<= target && target<= data[mid]) //left { last = mid; }else{ first= mid+1; } }else if(data[first] > data[mid] ) { //e.x. 1 2 3 0 1 1 1 if(data[mid]<= target && target<= data[last]) //right { first= mid+1; }else{ last = mid; } }else{ //data[first] == data[mid] first ++ ; } mid = (first+ last)/2; //更新mid的值 } return -1 ; }