您的位置:首页 > 其它

33. Search in Rotated Sorted Array && 81. Search in Rotated Sorted Array II

2017-10-21 10:44 666 查看

题目:

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.

  这道题目我认为不是很严密,因为他没有要求时间限制,那么只要顺序遍历不管这个数组的顺序如何都不会影响结果,只不过时间复杂度比较高,因为做习惯了时间复杂度有要求的,一开始就没有尝试这种,后来好奇试了一下居然也AC了==。。。但是还是要从每一道题目做出一点有意义有趣的事的~一般来说,对应有序序列的搜索,二分法是效率比较高的搜索方法。但是这道题目因为经过了一次轴旋转,所以并不是全部都满足有序序列。
参考别人的思路:点击打开链接
  这种思路可以让二分法适用于这种非有序序列:首先判断是一个序列是有序序列:如果是有序序列,那么nums[left]<nums[right]。将初始序列一分为二,必然有一半是有序的,最开始的时候left指向index=0,right指向index=-1(最后一个元素),每个循环中都找有序的那一半,将target和那一半的边界进行比较就可以得到是否在那个序列中了。每次都在有序序列中进行判断,就可以尽可能的用到二分法的效果。
public class Solution {
public int search(int[] nums, int target) {
int min = 0, max = nums.length - 1, mid = 0;
while(min <= max){
mid = (min + max) / 2;
if(nums[mid] == target){
return mid;
}
// 如果左半部分是有序的 注意这里的等号
if(nums[min] <= nums[mid]){
if(nums[min] <= target && target < nums[mid]){//注意这里的等号
max = mid - 1;
} else {
min = mid + 1;
}
// 如果右半部份是有序的
} else {
if(nums[mid] < target && target <= nums[max]){
min = mid + 1;
} else {
max = mid - 1;
}
}
}
// 不满足min <= max条件时,返回-1
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分查找