问题描述
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 become4 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.
问题分析
一个升序的数组会头尾连接然后单方向移动,相当于一个环,nums代表其中的一种状态,我们需要找到目标元素。
算法描述
对于查找算法我这里使用二分查找,先利用二分查找找到最小值所在位置,即原始数组头所在位置,然后再利用二分查找进行查找target,过程中真实的mid位置需要利用得到的最小值所在位置进行一下变换。最终找到target,否则返回-1;
时间复杂度为O(logN)
java实现
/**
* @Author: LiuYafei
* @Date: 2017/10/31
* @Time: 16:30
* @Description:
*/
public class SearchinRotatedSortedArray {
public static int search(int[] nums, int target) {
if(nums.length == 0 || nums == null){
return -1;
}
if(nums.length == 1) {
if(nums[0] == target) {
return 0;
}else {
return -1;
}
}
int a = 0;
int b = nums.length-1;
while (a<b) {
int mid = (a + b) / 2;
if(nums[mid] > nums[b]) {
a = mid + 1;
}
else {
b = mid;
}
}
int max = a;//a = b就是最小的数的下标
a = 0;
b = nums.length - 1;
while (a <= b) {
int mid = (a + b) / 2;
int realmid = (mid + max) % nums.length;
if(nums[realmid] == target)
return realmid;
if(nums[realmid] < target) {
a = mid + 1;
}
else {
b = mid - 1;
}
}
return -1;
}
public static void main(String [] args) {
int[] nums = {1,3};
int target = 3;
System.out.println(SearchinRotatedSortedArray.search(nums, target));
}
}