- 算法
- 1.二分查找找到最小值的位置
- 2.利用这一位置,再次进行二分查找
- 每次计算middle之后,需要再计算该middle位置对应数组在旋转前的元素是谁
- realMiddle = (middle + minIndex) % nums.length;
public int search(int[] nums, int target) {
int start = 0, end = nums.length - 1;
while (start < end) {
int middle = (start + end) >> 1;
if (nums[middle] < nums[end]) {
end = middle;
} else {
start = middle + 1;
}
}
int minIndex = start;
start = 0;
end = nums.length - 1;
while (start <= end) {
int middle = (start + end) >> 1;
int realMiddle = (middle + minIndex) % nums.length;
if (nums[realMiddle] == target) {
return realMiddle;
} else if (nums[realMiddle] > target) {
end = middle - 1;
} else {
start = middle + 1;
}
}
return -1;
} func search(nums []int, target int) int {
n := len(nums)
start, end := 0, n - 1
for start < end {
middle := (start + end) >> 1
if nums[middle] < nums[end] {
end = middle
} else {
start = middle + 1
}
}
minIndex, start, end := start, 0, n - 1
for start <= end {
middle := (start + end) >> 1
realMiddle := (middle + minIndex) % n
if (nums[realMiddle] == target) {
return realMiddle
} else if (nums[realMiddle] < target) {
start = middle + 1
} else {
end = middle - 1
}
}
return -1
} - 算法
- 1.二分查找找到最小值的位置
- 2.利用这一位置,将目标值和数组最后一个值比较,确定目标值所在的有序的那一半子数组范围
- 3.在子数组范围进行二分查找
public int search(int[] nums, int target) {
int n = nums.length;
int start = 0, end = n - 1;
while (start < end) {
int middle = (start + end) >> 1;
if (nums[middle] < nums[end]) {
end = middle;
} else {
start = middle + 1;
}
}
int minIndex = start;
start = (target <= nums[n-1]) ? minIndex : 0;
end = (target > nums[n-1]) ? minIndex - 1 : n - 1;
while (start <= end) {
int middle = (start + end) >> 1;
if (nums[middle] == target) {
return middle;
} else if (nums[middle] > target) {
end = middle - 1;
} else {
start = middle + 1;
}
}
return -1;
} func search(nums []int, target int) int {
n := len(nums)
start, end := 0, n - 1
for start < end {
middle := (start + end) >> 1
if nums[middle] < nums[end] {
end = middle
} else {
start = middle + 1
}
}
minIndex := start
if target <= nums[n-1] {
start, end = minIndex, n - 1
} else {
start, end = 0, minIndex - 1
}
for start <= end {
middle := (start + end) >> 1
if (nums[middle] == target) {
return middle
} else if (nums[middle] < target) {
start = middle + 1
} else {
end = middle - 1
}
}
return -1
}