问题链接:https://oj.leetcode.com/problems/search-in-rotated-sorted-array/
问题描述:
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.
问题API:public int search(int[] A, int target)
问题分析:这题其实就是典型的二分运用。这个题目再没有重复的情况下是logN, 只需要判断rotate之后中间分界后一边是rotate过后变成unsorted的样子,另一边依旧是sorted的递增的样子,所以判断好递增是哪一边之后,其实就跟Binary Search没有俩样了。代码如下:
public int search(int[] A, int target) {
if(A == null)
return -1;
int mid, head = 0, tail = A.length - 1;
while(head <= tail){
mid = (head + tail) / 2;
if(target == A[mid])
return mid;
else if(A[mid] < A[tail]){//这就是判断哪边是递增的一边,利用binary search的思想判断target是否在递增的一边,不在的话肯定就是在非递增的一边了
if(target > A[mid] && target <= A[tail])
head = mid + 1;
else
tail = mid - 1;
}else{
if(target < A[mid] && target >= A[head])//同上
tail = mid - 1;
else
head = mid + 1;
}
}
return -1;
}2017-10-29 Updated:
public int search(int[] nums, int target) {
int head = 0;
int tail = nums.length - 1;
while(head <= tail) {
int mid = (head + tail) / 2;
if (nums[mid] == target) {
return mid;
} else if(nums[mid] >= nums[head]) { // 需要注意的是这里用的是大于等于,原因在于mid可能是等于head的
if (target < nums[mid] && target >= nums[head]) {
tail = mid - 1;
} else {
head = mid + 1;
}
} else {
if (target > nums[mid] && target <= nums[tail]) {
head = mid + 1;
} else {
tail = mid - 1;
}
}
}
return -1;
}
本文介绍了一个经典的二分查找变种问题——在旋转过的有序数组中查找目标值,并提供了详细的算法思路及实现代码。
102

被折叠的 条评论
为什么被折叠?



