【一次过】Lintcode 457. 经典二分查找问题

在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1

样例

给出数组 [1, 2, 2, 4, 5, 5].

  • 对于 target = 2, 返回 1 或者 2.
  • 对于 target = 5, 返回 4 或者 5.
  • 对于 target = 6, 返回 -1.

挑战

O(logn) 的时间

解题思路1:

    循环实现。

class Solution {
public:
    /*
     * @param nums: An integer array sorted in ascending order
     * @param target: An integer
     * @return: An integer
     */
    int findPosition(vector<int> &nums, int target) 
    {
        // write your code here
        if(nums.empty())
            return -1;
        
        int i = 0;
        int j = nums.size()-1;
        
        while(i<=j)
        {
            int mid = (i+j)/2;
            
            if(nums[mid] == target)
                return mid;
            else if(nums[mid] < target)
                i = mid + 1;
            else
                j = mid - 1;
        }
        
        return -1;
    }
};

解题思路2:

    递归实现。

class Solution {
public:
    /*
     * @param nums: An integer array sorted in ascending order
     * @param target: An integer
     * @return: An integer
     */
    int findPosition(vector<int> &nums, int target) 
    {
        // write your code here
        if(nums.empty())
            return -1;
        
        int i = 0;
        int j = nums.size()-1;
        
        return findPosition(nums, target, i, j);
    }
    
    int findPosition(vector<int> &nums,int target, int begin, int end)
    {
        if(begin > end)
            return -1;
        int mid = (begin + end)/2;
        
        if(nums[mid] == target)
            return mid;
        else if(nums[mid] < target)
            return findPosition(nums,target,mid+1,end);
        else
            return findPosition(nums,target,begin,mid-1);
    }
};


猜你喜欢

转载自blog.csdn.net/majichen95/article/details/80729087