描述
给定一个整数数组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]在下标3处旋转之后变为[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
复制
示例3
输入:
[2],1
复制返回值:
-1
复制
思路分析:再次读题目,我们发现数组的旋转条件为根据旋转规则,使得数组变为[nums[t], nums[t+1], ..., nums[nums.length-1], nums[0], nums[1], ..., nums[t-1]],根据分析,发现该有序数组被分为两段,两段内容两两有序,所以我们又可以通过二分法去解决该问题,就是不断的与中间值做比较。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public int search (int[] nums, int target) {
// write code here
int left = 0;//设置左指针为初始位置
int right = nums.length - 1;//设置右指针为末尾位置
while(left <= right){//循环条件
int mid = left + (right - left) / 2;//中间值为
if(nums[mid] == target){//判断中间值是否等于目标值
return mid;
}
if(nums[mid] >= nums[left]){
if(nums[mid] > target){
right = mid - 1;
}
else{
left = mid + 1;
}
}
else{
if(target > nums[mid] && target <= nums[right]){//目标值大于中间值且小于最右边的值
left = mid + 1;
}
else{
right = mid - 1;
}
}
}
return -1;
}
}