来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
- 暴力解法:循环整个数组,记录下第一个出现目标值和最后一个出现目标值的位置即可。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
int *res = (int*)malloc(2 * sizeof(int));
*returnSize = 2;
int count = 0;//用于记录是否已经出现过目标值
res[0] = res[1] = -1;
int index = -1;//用于记录目标值的索引
for (int i = 0; i < numsSize; i++) {
if (nums[i] == target && count == 0){
res[0] = i;
index = i;
count++;
}
if (nums[i] == target && count != 0)
index = i;
}
res[1] = index;
return res;
}
- 二分查找法:
//查找第一个出现目标值的位置
int findFirstPosition(int* nums, int numsSize, int target) {
int low = 0;
int high = numsSize - 1;
while (low < high) {
int mid = (low + high) / 2;
//说明第一个出现目标值的位置在左半区
if (nums[mid] > target)
high = mid - 1;
//说明第一个出现目标值的位置在右半区
else if (nums[mid] < target)
low = mid + 1;
//说明第一个出现目标值的位置在左半区或者中间位置,因此要包含中间这个位置
else
high = mid;
}
if (nums[low] == target)
return low;
else
return -1;
}
//查找最后一个出现目标值的位置
int findLastPosition(int* nums, int numsSize, int target) {
int low = 0;
int high = numsSize - 1;
while (low < high) {
//这里mid值需要向上取整,否则会出错
int mid = 0;
if ((low + high) % 2 != 0)
mid = ((low + high) / 2) + 1;
else
mid = ((low + high) / 2);
//说明最后一个出现目标值的位置在左半区
if (nums[mid] > target)
high = mid - 1;
//说明最后一个出现目标值的位置在右半区
else if (nums[mid] < target)
low = mid + 1;
//说明最后一个出现目标值的位置在右半区或中间位置,因此要包含中间这个位置
else
low = mid;
}
return low;
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
int *res = (int*)malloc(2 * sizeof(int));
*returnSize = 2;
res[0] = res[1] = -1;
if (numsSize == 0)
return res;
int first = findFirstPosition(nums,numsSize,target);
if (first == -1)
return res;
int last = findLastPosition(nums,numsSize,target);
res[0] = first;
res[1] = last;
return res;
}