题目链接
思路
- nums是升序排列的数组进行旋转后的int数组;里面不会有重复数组
- 关于target,nums里面最多不会超过1个
- nums虽然经过旋转,但是肯定会有一半是有序的,另一半也可能有序
- 使用二分查找来查询target
- 定义left和right;开始循环:
- 求出left和right的中间值mid
- 如果mid的值等于target直接返回
- 如果不等判断下标0是否小于等于下标mid
- 相等,证明左边一半是有序的;
- 判断target在不在左半边,
- 如果在左半边移动right;不在左半边移动left
- 不等,证明右边一半是有序的
- 判断target在不在右半边
- 如果在右半边移动left;不在右半边移动right
- 循环结束找不到target;返回-1
java
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int length = nums.length;
if (length == 1) {
return nums[0] == target ? 0 : -1;
}
int left = 0;
int right = length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[0] <= nums[mid]) {
if (nums[0] <= target && target < nums[mid]) {
right = mid - 1;
continue;
}
left = mid + 1;
continue;
}
if (nums[mid] < target && target <= nums[length - 1]) {
left = mid + 1;
continue;
}
right = mid - 1;
}
return -1;
}
go
func search(nums []int, target int) int {
if nums == nil || len(nums) == 0 {
return 0
}
length := len(nums)
if length == 1 {
if nums[0] == target {
return 0
}
return -1
}
left, right := 0, length-1
for left <= right {
mid := (left + right) / 2
if nums[mid] == target {
return mid
}
if nums[0] <= nums[mid] {
if nums[0] <= target && target < nums[mid] {
right = mid - 1
continue
}
left = mid + 1
continue
}
if nums[mid] < target && target <= nums[length-1] {
left = mid + 1
continue
}
right = mid - 1
}
return -1
}