问题描述:
思路:
暴力解法比较直接不赘述但是时间复杂为n^2,主要是要求o(logN)的时间复杂度,肯定不能遍历,想到二分查找,找到目标target的所在的一个位置,然后向左 向右扩散查找,找到前面第一个不同的元素下标记为first = i+1,向右查找到第一个不同的元素,下标记为last = i-1。有一个细节,当向左查找到下标0时,或者向后查找到最后一个下标时如果还和目标元素值一样,就直接将first或last记录为当前下标然后结束循环就可以了。
代码实现:
暴力:
vector<int> searchRange(vector<int>& nums, int target) {
bool isFirst = 1;
bool isInSequence = 0;
vector<int> ans;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == target && isFirst) {
ans.push_back(i);
isInSequence = 1;
isFirst = 0;
}
else if (nums[i] != target && isInSequence) {
ans.push_back(i - 1);
break;
}
else if (nums[i] == target && isInSequence && i == nums.size() - 1) {
ans.push_back(i);
break;
}
else if (nums[i] > target) {
break;
}
}
if (ans.size() == 0) {
ans.push_back(-1);
ans.push_back(-1);
}
else if (ans.size() == 1) {
ans.push_back(ans[0]);
}
return ans;
}
二分查找:
int findTarget(vector<int>& nums, int left, int right, int target) {
int mid = (left + right) / 2;
if ((left == right && nums[mid] != target) || (left > right)) return -1;
if (nums[mid] == target) return mid;
else if (nums[mid] > target) return findTarget(nums, left, mid - 1, target);
else return findTarget(nums, mid + 1, right, target);
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans;
int first, last;
int index = findTarget(nums, 0, nums.size() - 1, target);
if (index == -1) {
first = -1;
last = -1;
}
else {
if (index == nums.size() - 1) {
last = index;
for (int i = nums.size() - 1; i >= 0; i--) {
if (nums[i] == target && i == 0) {
first = i;
break;
}
if (nums[i] != target) {
first = i + 1;
break;
}
}
}
else if (index == 0) {
first = index;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == target && i == nums.size() - 1) {
last = i;
break;
}
if (nums[i] != target) {
last = i - 1;
break;
}
}
}
else {
for (int i = index; i < nums.size(); i++) {
if (nums[i] == target && i == nums.size() - 1) {
last = i;
break;
}
if (nums[i] != target) {
last = i - 1;
break;
}
}
for (int i = index; i >= 0; i--) {
if (nums[i] == target && i == 0) {
first = i;
break;
}
if (nums[i] != target) {
first = i + 1;
break;
}
}
}
}
ans.push_back(first);
ans.push_back(last);
return ans;
}