首页 > 代码库 > [LeetCode#81]Search in Rotated Sorted Array II

[LeetCode#81]Search in Rotated Sorted Array II

The problem:

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

 

My analysis:

It metrics if we really master the idea underlying binary search.
What the duplicates bring into this problem is that:
For checking condition: if (A[low] <= A[mid])
What if low and mid not equal to 0, but A[low] and A[mid] have the same value ?
In this situation, we no longer be able to decide to iterate on which partion any more. We can only gain the information of ordered paration from the comparsion from A[low] and A[mid].
How to solve this problem?
? 1. directly move the ptr of mid, mid ++ or mid --. meaningless!!!
cause:
while (low <= high) {
mid = (low + high) / 2;

? 2. move the ptr of high, high--. wrong!!!
cause:
we write our checking condition based on A[low], we only knwo A[low] == A[mid] at present.

3. move the ptr of low. absoultely right!!! This could lead following effects:
a. move low ptr, reducing the range need to search. (since the current is not the target, we could discard it!)
b. move mid ptr. mid = (low + high) / 2. It make sense too, since A[mid] != target, we could discard it.

My solution:

public class Solution {    public int search(int[] A, int target) {                if (A.length == 0)            return -1;                int low = 0;        int high = A.length - 1;        int mid = -1;                while (low <= high) {            mid = (low + high) / 2;                        if (A[mid] == target)                return mid;                        if (A[low] <= A[mid]) { //either left partion or right partion is perfectly sorted.                                if (A[low] <= target && target < A[mid])                    high = mid - 1;                else                     low = mid + 1;                                } else{                                if (A[mid] < target && target <= A[high])                    low = mid + 1;                else                     high = mid - 1;            }        }                return -1;    }}

 

[LeetCode#81]Search in Rotated Sorted Array II