题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
白话题目:
找到目标值在有序的数组中的开始和结束位置,要快一些。
算法:
(1)二分法找符合的值
(2)二分法看在不在
(3)//二分法查找第一个 小于等于target的数
//二分法精髓:Mid=(low+high)/2 则每次 Mid 取值偏向 iLeft,high=mid,返回low
(4)//二分法查找第一个大于等于 target 的数
//二分法精髓:Mid=(Low+hight+1)/2 则每次 Mid 取值偏向 iRight,low=mid,返回high
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
//二分法查找 target 值
int binarySearch(int* nums, int numsSize, int target){
int low = 0;
int mid = 0;
int high = 0;
int flag = 0;
low = 0;
high = numsSize - 1;
while(low <= high)
{
mid = (low + high) / 2;
if (nums[mid] == target)
{
flag = 1;
break;
}
if (nums[mid] < target)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return flag;
}
//二分法查找第一个 小于等于target的数
int binarySearchLess(int* nums, int numsSize, int target){
int low = 0;
int mid = 0;
int high = 0;
low = 0;
high = numsSize - 1;
while(low < high)
{
mid = (low + high) / 2; //二分法精髓:Mid=(Left+Right)/2 则每次 iMid 取值偏向 iLeft
if (nums[mid] < target)
{
low = mid + 1;
}
else //取偏左的,
{
high = mid;
}
}
return low;
}
//二分法查找第一个大于等于 target 的数
int binarySearchGreater(int* nums, int numsSize, int target){
int low = 0;
int mid = 0;
int high = 0;
low = 0;
high = numsSize - 1;
while(low < high)
{
mid = (low + high + 1) / 2; //二分法精髓:iMid=(iLeft+iRight+1)/2 则每次 iMid 取值偏向 iRight
if (nums[mid] <= target)
{
low = mid;
}
else
{
high= mid - 1;
}
}
return high;
}
//1,使用二分法判断是否存在目标值
//2,使用二分法找到第一个 小于等于 target 的位置
//3,使用二分法找到第一个 大于等于 target 的位置
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
int* ret = (int *)malloc(sizeof(int) * 2);
ret[0] = -1;
ret[1] = -1;
*returnSize = 2;
//1,使用二分法判断是否存在目标值
if (binarySearch(nums, numsSize, target))
{
//2,使用二分法找到第一个 小于等于 target 的位置
ret[0] = binarySearchLess(nums, numsSize, target);
//3,使用二分法找到第一个 大于等于 target 的位置
ret[1] = binarySearchGreater(nums, numsSize, target);
}
return ret;
}
int main()
{
int numsSize;
scanf("%d",&numsSize);
int nums[numsSize];
int i;
for(i=0;i<numsSize;i++)
{
scanf("%d",&nums[i]);
}
int target;
scanf("%d",&target);
int returnSize;
int *result=searchRange(nums, numsSize, target, &returnSize);
for(i=0;i<returnSize;i++)
{
printf("%d ",result[i]);
}
return 0;
}