升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。
请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0 输出:4 示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3 输出:-1 示例 3:
输入:nums = [1], target = 0 输出:-1
模式识别:有序,或者局部部分有序,基本可以考虑使用二分法 算法描述:“丢弃”一半的数据 假如: nums = [4,5,6,7,0,1,2],则为情况1; nums = [6,7,0,1,2,4,5],则为情况2;
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
if (n == 0) {
return -1;
}
if (n == 1) {
return nums[0] == target ? 0 : -1;
}
//上面是极端情况下的判断
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
//先判断mid
if (nums[mid] == target) {
return mid;
}
//下面不进行mid判断
if (nums[0] <= nums[mid]) {
//情况1
if (nums[0] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
//情况2
if (nums[mid] < target && target <= nums[n - 1]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}
}