package com.heu.wsq.niuke.top200;
/**
* 在旋转过的有序数组中寻找目标值
* @author wsq
* @date 2021/6/1
* 描述
* 给定一个整数数组nums,按升序排序,数组中的元素各不相同。
* nums数组在传递给search函数之前,会在预先未知的某个下标 t(0 <= t <= nums.length-1)上进行旋转,让数组变为[nums[t], nums[t+1], ..., nums[nums.length-1], nums[0], nums[1], ..., nums[t-1]]。
* 比如,数组[0,2,4,6,8,10]在下标2处旋转之后变为[6,8,10,0,2,4]
* 现在给定一个旋转后的数组nums和一个整数target,请你查找这个数组是不是存在这个target,如果存在,那么返回它的下标,如果不存在,返回-1
* 示例1
* 输入:
* [6,8,10,0,2,4],10
* 返回值:
* 2
*
* 示例2
* 输入:
* [6,8,10,0,2,4],3
* 返回值:
* -1
*/
public class Search {
public int search (int[] nums, int target) {
// write code here
if(nums == null || nums.length == 0){
return -1;
}
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = (left + right) >> 1;
if(nums[mid] == target){
return mid;
}
// 将中间元素与 此时二分查找的左侧元素相比
// 若左侧元素小于 中间元素
// 情况1:目标元素 > 左侧元素,< 中间元素,那么目标值对应的位置必定在left和mid中间
// 情况2:除上面的情况外,我们可以在中间元素的右侧找到,更大的元素和更小的元素
if(nums[mid] >= nums[left]){
if(target >= nums[left] && target < nums[mid]){
right = mid - 1;
}else{
left = mid + 1;
}
}else{
// 当中间元素小于左侧元素值时候,
// 情况1:中间元素 < target < 右侧元素,那么目标值肯定mid和right之间
// 情况2:除上面情况外,在中间元素左侧,可以找到大于或小于中间元素的元素
if(target <= nums[right] && target > nums[mid]){
left = mid + 1;
}else{
right = mid - 1;
}
}
}
return -1;
}
}
在旋转过的有序数组中寻找目标值
最新推荐文章于 2022-10-02 21:32:09 发布