LeetCode Search in Rotated Sorted Array

来源:互联网 发布:淘宝规则培训 编辑:程序博客网 时间:2024/06/10 22:31

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.


采用二分查找,注意区间的讨论 最大值与最小值的交界 在哪个区间(可以通过数组 中间值 与 两端值 做对比得出);注意边界条件。


class Solution {public:int search(int A[], int n, int target) {if (n <= 0)return -1;return find(A, 0, n - 1, target);}int find(int A[], int left, int right, int target) {if (right < left)return -1;if (left == right && A[left] != target)return -1;int mid = left + ((right - left) >> 1);if (A[mid] == target) {return mid;}else if (A[mid] > target) {if (A[mid] >= A[left]) {         //注意 一定要带“=”,当只有两个元素时,mid == leftif (A[left] == target)return left;else if (A[left] < target)return find(A, left + 1, mid - 1, target);elsereturn find(A, mid + 1, right, target);}else if (A[mid] < A[right]) {return find(A, left, mid - 1, target);}}else {if (A[mid] >= A[left]) {           //注意  同样要带“=”return find(A, mid + 1, right, target);} else if (A[mid] < A[right]) {if (A[right] > target)return find(A, mid + 1, right - 1, target);else if (A[right] == target)return right;else {return find(A, left, mid - 1, target);}}}}};


一个思路更清晰的方法:


class Solution {public:int search(int A[], int n, int target) {return find(A, 0, n - 1, target);}int find(int A[], int left, int right, int target) {if (right < left)return -1;int mid = left + ((right - left) >> 1);if (A[mid] == target)return mid;else if (A[left] < A[right])return A[mid] < target ? find(A, mid + 1, right, target) : find(A, left, mid - 1, target);else {int temp = find(A, left, mid - 1, target);if (temp != -1)return temp;else find(A, mid + 1, right, target);}}};


0 0
原创粉丝点击