题目分析:
- 在旋转后的有序数组中查找某个元素。(数组中存在重复元素)
解题思路:
两种方法实现
方法1:遍历实现
1)先判断要查找的数与数组头元素和数组尾元素大小,确定遍历方向;
2)以一定的方向遍历查找,判断是否存在次元素。
注意:遍历过程中若出现逆序情况,则说明不存在此元素。
方法2:利用二分查找实现
1)若target == A[mid],直接返回mid即可;
有序情况下的处理如下:
2)若A[first] < A[mid]时,判断target是否在A[first,mid)之间,在它们之间,则last = mid,否则first = mid + 1;
3)若A[first] > A[mid]时,判断target是否在A(mid, last - 1]之间,在它们之间,则first = mid + 1,否则last = mid。
4)若A[firtst] == A[mid]时,start++,继续判断即可。
注意:本题由于数组元素可能存在相等情况,故注意情况4的处理方式。
实现程序
class Solution { public: bool search(vector<int> nums, int target) { if (nums[0] == target) return true; if (nums[nums.size() - 1] == target) return true; // 从前向后遍历查找 if (nums[0] < target) { for (int i = 1; i < nums.size(); i++) { if (nums[i] == target) return true; if (nums[i] < nums[i - 1]) return false; } } // 从后向前遍历查找 else if (nums[nums.size() - 1] > target) { for (int i = nums.size() - 2; i >= 0; i--) { if (nums[i] == target) return true; if (nums[i] > nums[i + 1]) return false; } } return false; } //二分查找实现 bool search1(vector<int> &nums, int target) { if (nums.size() == 0) return false; int start = 0; int end = nums.size() - 1; int mid; while (start <= end) { mid = (start + end) / 2; if (target == nums[mid]) return true; if (nums[start] < nums[mid]) { if (nums[mid] > target && nums[start] <= target) { end = mid - 1; } else { start = mid + 1; } } else if (nums[mid] < nums[start]) { if (nums[mid] < target && nums[end] >= target) { start = mid + 1; } else { end = mid - 1; } } // 处理nums[mid] == nums[start]特殊情况 else { start++; } } return false; } };