给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
#include<iostream> #include<stack> #include<algorithm> #include<string> #include<vector> using namespace std; /* 先使用二分查找法, 找出其中一个目标值的位置,递归调用搜索到中间值; 然后向两边搜索找出起始和结束的位置; */ class Solution { public: vector<int> searchleftandright(vector<int>& nums, int target) { int idx = search(nums, 0, nums.size() - 1, target); if (idx == -1) { return{ -1, -1 }; } int left = idx, right = idx; while (left > 0 && nums[left - 1] == nums[idx]) { --left; } while (right < nums.size() - 1 && nums[right + 1] == nums[idx]) { ++right; } return{ left, right }; } int search(vector<int>& nums, int left, int right, int target) { if (left > right) { return -1; } int mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } if (nums[mid] < target) { return search(nums, mid + 1, right, target); } else { return search(nums, left, mid - 1, target); } } }; int main() { int a[1000]; int x; int i = 0; vector<int> vec; vector<int> ans; int target; while (cin >> a[i]) { vec.push_back(a[i]); i++; x = cin.get(); if (x == ' ') break; } cin >> target; ans = Solution().searchleftandright(vec, target); cout << ans[0] << " " << ans[1] << endl; system("pause"); return 0; }