有序数组翻转后的查找

题目:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值