题目
有一个长度为 n 的按严格升序排列的整数数组 nums ,在实行 search 函数之前,在某个下标 k 上进行旋转,使数组变为[nums[k],nums[k+1],…,nums[nums.length-1],nums[0],nums[1],…,nums[k-1]]。给定旋转后的数组 nums 和一个整型 target ,请你查找 target 是否存在于 nums 数组中并返回其下标(从0开始计数),如果不存在请返回-1。
比如,数组[0,2,4,6,8,10]在下标3处旋转之后变为[6,8,10,0,2,4], 当给定target为10时,10的下标是2,target为3时,nums数组中不存在3,所以返回-1
题解一
最简单的方法是循环数组,与target进行比较,相等返回下标,否则返回-1.
代码
public int search (int[] nums, int target) {
// write code here
for(int i=0;i<nums.length;i++){
if(nums[i]==target){
return i;
}
}
return -1
}
题解二
用二分法
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;
}