題目描述
給定一個按照升序排列的整數數組 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;
}