题意:

image.png

解题思路:

  1. 思路:
  2. 1 2 3 4 5 6 7 可以大致分为两类,
  3. 第一类 2 3 4 5 6 7 1 这种,也就是 nums[low] <= nums[mid]。此例子中就是 2 <= 5
  4. 这种情况下,前半部分有序。因此如果 nums[low] <= target < nums[mid],则在前半部分找,否则去后半部分找。
  5. 第二类 6 7 1 2 3 4 5 这种,也就是 nums[low] > nums[mid]。此例子中就是 6 > 2
  6. 这种情况下,后半部分有序。因此如果 nums[mid] <target<=nums[high],则在后半部分找,否则去前半部分找。

PHP代码实现:

  1. class Solution {
  2. function search($nums, $target) {
  3. if (count($nums) == 0) return -1;
  4. $low = 0;
  5. $high = count($nums) - 1;
  6. while ($low <= $high) {
  7. $mid = $low + floor(($high - $low) >> 1);
  8. if ($nums[$mid] == $target) return $mid;
  9. //前半部分有序,注意此处用小于等于
  10. if ($nums[$mid] >= $nums[$low]) {
  11. //target在前半部分
  12. if ($target >= $nums[$low] && $target < $nums[$mid]) {
  13. $high = $mid - 1;
  14. } else $low = $mid + 1;
  15. } else {
  16. if ($target > $nums[$mid] && $target <= $nums[$high]) {
  17. $low = $mid + 1;
  18. } else $high = $mid - 1;
  19. }
  20. }
  21. return -1;
  22. }
  23. }

GO代码实现:

  1. func search(nums []int, target int) int {
  2. if len(nums) <= 0 { return -1 }
  3. low := 0
  4. high := len(nums) - 1
  5. mid := 0
  6. for low <= high {
  7. mid = (low + high) / 2
  8. if nums[mid] == target { return mid }
  9. if nums[mid] >= nums[low] {
  10. if nums[mid] > target && nums[low] <= target {
  11. high = mid - 1
  12. } else {
  13. low = mid + 1
  14. }
  15. } else {
  16. if nums[mid] < target && nums[high] >= target {
  17. low = mid + 1
  18. } else {
  19. high = mid - 1
  20. }
  21. }
  22. }
  23. return -1
  24. }