Leetcode: 34. Search for range(Week9, Medium)

来源:互联网 发布:linux x264命令 编辑:程序博客网 时间:2024/06/08 11:00

注:本题采用二分法的思想


Leetcode 34
Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm’s runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

  • 题意:设计一个算法找到target的index范围,并且该算法的时间复杂度是O(log n)
  • 思路:正常情况下,使用遍历的代码非常简洁,可以很轻易的解决这个问题。然而题目有时间复杂度的限制,O(log n)让我立刻反应出使用二分法的思想。
  • 算法
    • 先使用二分法,找到数组中其中一个target的index;
    • 然后使用两个while循环,以二分法得到的index为起点向两边扩展;
    • 当达到边界时,记录下边界的位置,得到index的范围。

代码如下:

/* 2017/11/5  34. Search for range思路:1.先用二分法找到目标值index;2.然后以这个index为起点,向两边扩展,得到目标index的范围*/class Solution {public:    int search_target(vector<int>& nums, int target) {        if (nums.size() == 0) return -1;        int top = nums.size()-1;        int mid = (nums.size()-1)/2;        int low = 0;        while(1) {            if (low >= top) {                if (nums[low] != target) {                    return -1;                } else {                    return low;                }            }            if (nums[mid] < target) {                low = mid+1;            } else if (nums[mid] > target) {                top = mid-1;            } else {                return mid;            }            mid = low + (top-low)/2;        }    }    vector<int> searchRange(vector<int>& nums, int target) {        vector<int> result(2, 0);        result[0] = search_target(nums, target);        result[1] = result[0];        if (result[0] == -1) return result;        while(result[0] >= 0) {            if (nums[result[0]] == target) {                if (result[0] == 0) break;                result[0]--;            } else {                result[0]++;                break;            }        }        while(1) {            if (nums[result[1]] == target) {                if (result[1] == nums.size()-1) break;                result[1]++;            } else {                result[1]--;                break;            }        }        return result;    }};

以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!


原创粉丝点击