题目

类型:二分搜索
难度:中等
image.png

解题思路

二分查找。
对于数组中有重复元素的情况,二分查找时可能会有 a[l]=a[mid]=a[r],此时无法判断区间 [l,mid] 和区间 [mid+1,r] 哪个是有序的。对于这种情况,只能将当前二分区间的左边界加一,右边界减一,然后在新区间上继续二分查找。

代码

  1. class Solution {
  2. public boolean search(int[] nums, int target) {
  3. int n = nums.length;
  4. if (n == 0) {
  5. return false;
  6. }
  7. if (n == 1) {
  8. return nums[0] == target;
  9. }
  10. int l = 0, r = n - 1;
  11. while (l <= r) {
  12. int mid = (l + r) / 2;
  13. if (nums[mid] == target) {
  14. return true;
  15. }
  16. if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
  17. ++l;
  18. --r;
  19. } else if (nums[l] <= nums[mid]) {
  20. if (nums[l] <= target && target < nums[mid]) {
  21. r = mid - 1;
  22. } else {
  23. l = mid + 1;
  24. }
  25. } else {
  26. if (nums[mid] < target && target <= nums[n - 1]) {
  27. l = mid + 1;
  28. } else {
  29. r = mid - 1;
  30. }
  31. }
  32. }
  33. return false;
  34. }
  35. }