有序数组翻转后的查找

题目:

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.

假设一个有序数组在某点被翻转了,现在给你一个目标值去查找,如果找到,返回它的下标,否则返回-1.。假设没有重复的数。

思路:

先参看查找有序数组中的最小值:http://blog.csdn.net/u012243115/article/details/41923667

本题依然使用二分法,难点在于如何判断 target 在前半段还是后半段。对于无重复的数组4 5 6 7 0 1 2,如果满足 A[begin] <= A[mid] ,即数组的第一个值小于中间值 4 < 7 ,那么可以断定前半段数组有序。如果不满足这个条件,(比如:4 5 0 1 2) 则说明后半段有序。因为把这个数组从中间分开后,一定至少有半个数组是有序的。然后再判断 target 是否在有序的半段中(这个很好判断),如果在,则相当于在有序数组中查找,很简单。如果不在有序的那半段,则一定在另外半段里。然后使用迭代即可把target找出。

public class Solution {  
public int search(int A[], int n, int target)   
    {  
        int begin = 0;  
        int end = n-1; 
        while(begin <= end) 
        {  
            int mid = (begin + end)/2; 
            //判断mid是否为target,如果是,直接返回,如果不是,再判断target是在前半段还是后半段 
            if(A[mid] == target)  
            {  
                return mid;  
            }  
            //如果前半段有序 
            if(A[begin] <= A[mid])  
            {  
                //判断target是否在前半段,如果在,则继续遍历前半段,如果不在,则继续遍历后半段 
                if(A[begin] <= target && target < A[mid])  
                    end = mid - 1; 
                else  
                    begin = mid + 1;  
            }  
            //else说明后半段有序 
            else  
            {  
                //判断target是否在后半段,如果在,则继续遍历后半段,如果不在后半段,则继续遍历前半段 
                if(A[mid] < target && target <= A[end]) 
                    begin = mid + 1;  
                else  
                    end = mid - 1; 
            }  
        }  
        return -1;  
    }  

}

转自:https://blog.csdn.net/u012243115/article/details/42002283

点赞