LeetCode 33 搜索旋转排序数组(java)
一、题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
例如:数组【0,1,2,3,4,5,6,7】可能变为【4,5,6,7,0,1,2】
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1.
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是O(log n)级别
二、示例:
三、解题思路:
由于题目要求算法时间复杂度必须是O(log n)级别,所以不可以直接遍历数组。
不管给出的数组如何进行旋转,都是由有序数组组成,只不过是分为了两个小的有序数组,所以我们可以使用二分法。
定义双指针,分别指向数组的开头start和结尾end,再选取数组中间值min粗略将数组分为两个部分,进行判断:
- 用target和数组中间值mid进行比较,若相同则直接return mid
- 若不同则分别对两个小片段进行判断:在有序的小片段中判断target是否存在于此片段中,如果存在则将双指针定位于此片段中。若不存在,则将双指针定位于另一个片段里。
- 在更新过双指针的小片段中再次定位mid,重复以上方法,直到找到target或者返回-1.
四、代码如下:
class Solution {
public int search(int[] nums, int target) {
if(nums.length==0) return -1;
int start =0;
int end =nums.length-1;
while (start<=end){
int mid = (start+end)/2;
if (target==nums[mid]) return mid;
if(nums[start]<=nums[mid]){
if(target>=nums[start]&&target<nums[mid]){
if(target==nums[start]) return start;
end=mid-1;
}else {
start=mid+1;
}
}else{
if(target>nums[mid]&&target<=nums[end]){
if(target==nums[end]) return end;
start=mid+1;
}else {
end=mid-1;
}
}
}
return -1;
}
}