二分查找的改进

在转动过的有序数组中寻找目标值

http://www.nowcoder.com/questionTerminal/7cd13986c79d4d3a8d928d490db5d707

  • 本题的调试有点问题。。

一、暴力『不是最优』

class Solution {
public:
    /**
     * 
     * @param A int整型一维数组 
     * @param n int A数组长度
     * @param target int整型 
     * @return int整型
     */
    int search(int* A, int n, int target) {
        // write code here
        int loop=n;
        while( loop-- )
        {
            if( A[loop]==target )
            {
                return loop;
            }
        }

        return -1;

    }
};

二、改进的『二分查找』

参考牛油lzx071021

//不要被“旋转”而迷惑,“有序”并不是二分查找的核心
    // 二分查找的核心是"通过界桩快速决定查找方向,大幅缩短查找空间"
    // 只要能快速确定界桩,就能使用二分查找
    // 充分利用有序数组能够快速获取边界值的特性
    // 利用这一特性可以快速确定目标值应处的区间
class Solution {
public:
    /**
     * 
     * @param A int整型一维数组 
     * @param n int A数组长度
     * @param target int整型 
     * @return int整型
     */
    int search(int* A, int n, int target) {
        // write code here
        int Left=0,Right=n-1,mid;

        while( Left<=Right )
        {
            mid= Left + (Right-Left)/2;

            if( A[mid]==target )
            {
                return mid;
            }

            //左边的有序区间
            if( A[mid]>=A[Left] )
            {
                if( A[Left]<=target && target<A[mid])
                {
                    Right=mid-1;
                }
                else 
                {
                    Left=mid+1;
                }
            }
            else 
            {
                if( A[mid]<target && target<=A[Right] )
                {
                    Left=mid+1;
                }
                else 
                {
                    Right=mid-1;
                }

            }


        }

        //没有找到的话
        return -1;
    }
};
全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务