题意:
解题思路:
思路:1 2 3 4 5 6 7 可以大致分为两类,第一类 2 3 4 5 6 7 1 这种,也就是 nums[low] <= nums[mid]。此例子中就是 2 <= 5。这种情况下,前半部分有序。因此如果 nums[low] <= target < nums[mid],则在前半部分找,否则去后半部分找。第二类 6 7 1 2 3 4 5 这种,也就是 nums[low] > nums[mid]。此例子中就是 6 > 2。这种情况下,后半部分有序。因此如果 nums[mid] <target<=nums[high],则在后半部分找,否则去前半部分找。
PHP代码实现:
class Solution { function search($nums, $target) { if (count($nums) == 0) return -1; $low = 0; $high = count($nums) - 1; while ($low <= $high) { $mid = $low + floor(($high - $low) >> 1); if ($nums[$mid] == $target) return $mid; //前半部分有序,注意此处用小于等于 if ($nums[$mid] >= $nums[$low]) { //target在前半部分 if ($target >= $nums[$low] && $target < $nums[$mid]) { $high = $mid - 1; } else $low = $mid + 1; } else { if ($target > $nums[$mid] && $target <= $nums[$high]) { $low = $mid + 1; } else $high = $mid - 1; } } return -1; }}
GO代码实现:
func search(nums []int, target int) int { if len(nums) <= 0 { return -1 } low := 0 high := len(nums) - 1 mid := 0 for low <= high { mid = (low + high) / 2 if nums[mid] == target { return mid } if nums[mid] >= nums[low] { if nums[mid] > target && nums[low] <= target { high = mid - 1 } else { low = mid + 1 } } else { if nums[mid] < target && nums[high] >= target { low = mid + 1 } else { high = mid - 1 } } } return -1}