34. Search for a Range

来源:互联网 发布:网络四十大禁书 编辑:程序博客网 时间:2024/05/21 15:39

问题描述
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].
问题分析
该问题的要求很简单,给定一组按升序排序的整数,找出给定目标值的起始和结束位置。并且题目要求算法的复杂度为O(logn),如果未在数组中找到目标值,返回[-1, -1]。那么我们可以先用二分法找到所要找的target值,然后在这个值的位置向左和向右找和它相等的值即可。
代码展示

#include <iostream>#include <stdlib.h>#include <string>#include <vector>using namespace std;class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        int n=nums.size();        int left = 0;          int right = n - 1;          vector<int> result;          result.push_back(-1);          result.push_back(-1);          while(left <= right)          {              int mid = (left + right) / 2;  //用二分法找到符合要求的值            if(nums[mid] > target){                  right = mid - 1;              }              else if(nums[mid] < target){                  left = mid + 1;              }              else{                 //找到了符合要求的值就从这个位置向左向右找其他和该值相等的值,几率它们的位置                result[0] = mid;                  result[1] = mid;                  int j = mid - 1;                  while(j >= 0 && nums[j] == target){                      result[0] = j;                      j--;                  }                  j = mid + 1;                  while(j < n && nums[j] == target){                      result[1] = j;                      j++;                  }                break;              }          }          return result;      }};int main(){    int n;    vector<int> nums;    cout<<"请输入向量长度:";    cin>>n;    int num[n];    for(int i = 0;i<n;i++){        cin>>num[i];        nums.push_back(num[i]);    }    cout<<"请输入target: ";    int target;    cin>>target;    Solution solution;    vector<int> result=solution.searchRange(nums, target);    for(int i=0;i<result.size();i++){        cout<<result[i]<<"  ";    }    cout<<endl;}

运行结果展示
这里写图片描述

原创粉丝点击