给定按升序排序的整数数组,找到给定目标值的开始和结束位置。 如果在数组中找不到目标,则返回[-1,-1]。

来源:互联网 发布:淘宝上传好评截图 编辑:程序博客网 时间:2024/06/06 14:57

本题源自leetcode  34

-----------------------------------------------------------

思路:用二分查找的思路,首先找出最左边的target,就是当target <= num【mid】 end = mid;

2 然后 第一次循环结束后判断 start 等于 target,就是最左边的。然后找最右边的target  一样用 二分查找的方法

代码:

vector<int> searchRange(vector<int>& nums, int target) {        int n = nums.size();        vector<int> ret(2, -1);        if(n == 0)            return ret;            int i = 0, j = n - 1;        while (i < j)  //找最左边的        {            int mid = (i + j) /2;            if (nums[mid] < target)                i = mid + 1;            else                 j = mid;        }        if (nums[i]!=target)             return ret;        else            ret[0] = i;            // 找最右边的        j = n-1;  //         while (i < j)        {            int mid = (i + j) /2 +1 ;// 让中间点基于右边            if (nums[mid] > target)                 j = mid - 1;              else                i = mid;        }        ret[1] = j;        return ret;     }
思路 2  用 stl的函数

代码:

vector<int> searchRange(vector<int>& nums, int target) {        int n = nums.size();        vector<int> res(2,-1);        if(n == 0)            return res;        int lo = lower_bound(nums.begin(),nums.end(),target)-nums.begin();        if(lo == n || nums[lo] != target)            return res;        res[0] = lo;        int hi = upper_bound(nums.begin(),nums.end(),target) - nums.begin() -1;        res[1] = hi;        return res;    }

思路3 :

代码;

 int n = nums.size();        vector<int> res(2,-1);        if(n == 0)            return res;        int lo = 0;        int hi = n-1;        int idx = -1;        while(lo <= hi){  //求 最左边的 target            int mid = (lo + hi) >> 1;            if(nums[mid] >= target)                hi = mid - 1;            else                lo = mid + 1;            if(nums[mid] == target)                idx = mid;        }        res [0] = idx;       // lo = 0;        hi = n-1;        while(lo <= hi){   //最右边的target            int mid = (lo + hi) >> 1;            if(nums[mid] <= target)                lo = mid + 1;            else                hi = mid - 1;            if(nums[mid] == target)                idx = mid;        }        res[1] = idx;        return res;    }


阅读全文
0 0