题意:

image.png

解题思路:

  1. 思路:二分法,分三种情况考虑:
  2. 1. 10111 1110111101 这种。此种情况下 nums[low] == nums[mid],
  3. 分不清到底是前面有序还是后面有序,此时 start++ 即可。相当于去掉一个重复的干扰项。
  4. 2. 2 3 4 5 6 7 1 这种,也就是 nums[low] < nums[mid]。此例子中就是 2 < 5
  5. 这种情况下,前半部分有序。因此如果 nums[low] <= target <= nums[mid],则在前半部分找,否则去后半部分找。
  6. 3. 6 7 1 2 3 4 5 这种,也就是 nums[high] > nums[mid]。此例子中就是 5 > 2
  7. 这种情况下,后半部分有序。因此如果 nums[mid] < target <= nums[high]。则在后半部分找,否则去前半部分找

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @param Integer $target
  5. * @return Boolean
  6. */
  7. function search($nums, $target) {
  8. $low = 0;
  9. $high = count($nums) - 1;
  10. while ($low < $high) {
  11. $mid = $low + floor(($high - $low) / 2);
  12. if ($nums[$mid] == $target) {
  13. return true;
  14. }
  15. if ($nums[$low] < $nums[$mid]) {//左半有序
  16. if ($nums[$mid] >= $target && $nums[$low] <= $target) {
  17. $high = $mid - 1;
  18. } else {
  19. $low = $mid + 1;
  20. }
  21. } else if ($nums[$high] > $nums[$mid]) {//右边部分有序
  22. if ($nums[$mid] <= $target && $nums[$high] >= $target) {
  23. $low = $mid + 1;
  24. } else {
  25. $high = $mid - 1;
  26. }
  27. } else {
  28. //去重
  29. if ($nums[$mid] == $nums[$low]) {
  30. $low++;
  31. } else {
  32. $high--;
  33. }
  34. }
  35. }
  36. return $nums[$low] == $target;
  37. }
  38. }

GO代码实现:

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