LintCode-First Position of Target

First Position of Target

Description

For a given sorted array (ascending order) and a target number, find the first index of this number in O(log n) time complexity.

If the target number does not exist in the array, return -1.

Example

If the array is [1, 2, 3, 3, 4, 5, 10], for given target 3, return 2.

Challenge

If the count of numbers is bigger than 2^32, can your code work properly?

  • 题目模板

    class Solution {
    public:
      /**
       * @param nums: The integer array.
       * @param target: Target to find.
       * @return: The first position of target. Position starts from 0.
       */
      int binarySearch(vector<int> &nums, int target) {
          // write your code here
      }
    };
    
  • 题目大意

    给你个数组,再给你一个数,找出这个数在这个数组中的最低位置。要求时间复杂度为O(logn)。

  • 大概思路

    题目已经给的提示很明显了,二分查找,或者高级一点三分查找也可以。

    class Solution {
    public:
      /**
       * @param nums: The integer array.
       * @param target: Target to find.
       * @return: The first position of target. Position starts from 0.
       */
      int binarySearch(vector<int> &nums, int target) {
          // write your code here
          int le = 0, ri = nums.size()-1;
          int min = -1;
          int first = 1;
          while(le <= ri){
            int mid = (le + ri) / 2;
            if(nums[mid] == target){
              if(first){
                first = 0;
                min = mid;
              }
              else
                min = min < mid ? min : mid;
              ri = mid - 1;
            }
            else if(nums[mid] > target)
              ri = mid - 1;
            else
              le = mid + 1;
          }
          return min;
      }
    };
  • 细节方面

    题目中要求是最低位置,所以我们还要维护一个最低位置的变量,而不是像以前一样找到就行,那么改变就是,当nums[mid] == target时不直接返回,而是更新维护的最小位置值,然后ri = mid-1就可以了,这里因为是维护最小值,所以再向左面找,动ri而不是le。

  • 题目链接:https://www.lintcode.com/problem/first-position-of-target/description

你可能感兴趣的:(LintCode)