网址
题目
一顺序排列的数组以某个位置为中心旋转后所得数组,从中以O( l o g n logn logn)时间找到某个数的索引。
解法
- 挺简单一题,花在debug时间较长,一些特殊情况总是没搞对…
- 我的做法是找出偏移量的大小,再基于这个偏移量二分
- 这个时间超过100%的人也是惊了?
- 看讨论区还有其它的做法,比如可以直接把数组劈成两段只需要在可能存在的一段找即可。这种做法应该花的时间更少。
class Solution {
public int search(int[] nums, int target) {
int start = 0, end = nums.length - 1, bias;
while(start < end){
int mid = (start + end) / 2;
// System.out.println(start+" "+end);
if(nums[mid] > nums[end]){
start = mid + 1;
}else{
end = mid;
}
}
bias = start; start = 0; end = nums.length - 1;
while(start <= end){
int mid = (start + end) / 2;
int mid_index = (bias+mid)%nums.length;
// System.out.println(bias+" "+start+" "+end+" "+mid+" "+mid_index);
if(nums[mid_index] == target){
return mid_index;
}else if(nums[mid_index] < target){
start = mid + 1;
}else{
end = mid - 1;
}
}
return -1;
}
}