- 问题描述:
1.Suppose a sorted array 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.
2.允许存在重复元素,会对时间复杂度造成影响么? -
问题分析:
首先来分析问题一:二分搜索的原理是每次去掉一半的元素即可,也就是只要按照规则可以去除一般的元素,复杂度 就可以降至O(logn),所以,允许数组列表部分元素部分有序即可,旋转数组要么是左半边有序,要么是右半边有序,我们通过的有序的半边来判断target是否在此,然后来移动高低指针。代码如下:
下面来解决问题二,如果允许重复元素存在,那么会对算法的复杂度造成影响么?假设原始数组是1,3,1,1,1。很明显我们不知道往哪边移动指针,那么我们就只移动一步就可以拜托这种困境,当然假设一直是出于困境中,我们就可以价格判断语句来降低复杂度。代码如下:public class Solution { public int search(int[] nums, int target) { if(nums == null || nums.length == 0) return -1; int low = 0, high = nums.length -1,mid; while(low <= high){ mid = low + ((high - low) >> 1); if(nums[mid] == target) return mid; if(nums[low] <= nums[mid]){ //left half array is sorted if(nums[low] <= target && nums[mid] >= target) high = mid -1; else low = mid + 1; } else{ if(nums[mid] <= target && nums[high] >= target) low = mid +1; else high = mid -1; } } return -1; } }
public class Solution { public boolean search(int[] nums, int target) { if(nums == null || nums.length == 0) return false; int low = 0, high = nums.length -1,mid; while(low <= high){ mid = low + ((high - low) >> 1); if(nums[mid] == target) return true; if(nums[low] < nums[mid]){ //left half array is sorted if(nums[low] <= target && nums[mid] >= target) high = mid -1; else low = mid + 1; } else if(nums[mid] < nums[high]){ if(nums[mid] <= target && nums[high] >= target) low = mid +1; else high = mid -1; } else { if(nums[high] == target) return true; high--; } } return false; } }