Problem: 33. 搜索旋转排序数组
文章目录
- 题目描述
- 思路
- 复杂度
- Code
题目描述
思路
1.初始化左右指针:首先,定义两个指针left和right,分别指向数组的开始和结束位置。
2.计算中间值:在left和right之间找到中间位置mid。
3.比较中间值和目标值:如果中间位置的值等于目标值,那么就返回中间位置mid。
4.判断旋转点:如果中间位置的值小于或等于右侧位置的值,说明旋转点在左侧或者就是中间位置。4.1.如果目标值在中间值和右侧值之间,那么将左侧指针移动到中间位置的右侧(left = mid + 1)。
4.2.否则,将右侧指针移动到中间位置的左侧(right = mid - 1)。
5.处理左侧有序的情况:如果中间位置的值大于右侧位置的值,说明旋转点在右侧。
5.1.如果目标值在左侧值和中间值之间,那么将右侧指针移动到中间位置的左侧(right = mid - 1)。
5.2.否则,将左侧指针移动到中间位置的右侧(left = mid + 1)。
6.未找到目标值:如果在数组中没有找到目标值,那么返回-1。
复杂度
时间复杂度:
O ( l o g n ) O(logn) O(logn)
空间复杂度:
O ( 1 ) O(1) O(1)
Code
class Solution {
/**
* Search for a rotationally sorted array(Binary search)
*
* @param nums Given array
* @param target Number to be found
* @return int
*/
public int search(int[] nums, int target) {
if (nums == null || nums.length < 1) {
return -1;
}
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
//Found
if (nums[mid] == target) {
return mid;
//Right-side interval order
} else if (nums[mid] <= nums[right]) {
//On the right
if (target >= nums[mid] && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
} else { //Left-side interval order
//On the left
if (target < nums[mid] && target >= nums[left]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
}
return -1;
}
}