<leetcode>NO.34 在排序数组中查找元素的第一个和最后一个位置

    xiaoxiao2022-07-02  103

    给定一个按照升序排列的整数数组 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] /** * Note: The returned array must be malloced, assume caller calls free(). */ int* searchRange(int* nums, int numsSize, int target, int* returnSize){ *returnSize=2; int *ret=(int *)malloc(sizeof(int)*(*returnSize)); ret[0]=-1; if(numsSize<1) { ret[1]=-1; return ret; } int left=0,right=numsSize,medium=(left+numsSize)/2; for(;left<medium;medium=(left+right)/2) { if(nums[medium]==target||nums[left]==target||nums[right-1]==target) { break; } if(nums[medium]>target) { right=medium; } else { left=medium; } } if(nums[medium]==target)ret[0]=medium; else if(nums[left]==target)ret[0]=left; else if(nums[right-1]==target)ret[0]=right-1; else { ret[1]=-1; return ret; } ret[1]=ret[0]; for(left=0,right=ret[0],medium=(right+left)/2;left<medium||nums[left]==target;medium=(right+left)/2) { if(nums[left]==target) { ret[0]=left; break; } if(nums[medium]==target) { right=medium; } else { left=medium; } } ret[0]=ret[0]<right?ret[0]:right; for(left=ret[1],right=numsSize,medium=(right+left)/2;left<medium;medium=(right+left)/2) { if(nums[right-1]==target) { ret[1]=right-1; break; } if(nums[medium]==target) { left=medium; } else { right=medium; } } ret[1]=ret[1]>left?ret[1]:left; return ret; }

    执行用时 : 12 ms, 在Find First and Last Position of Element in Sorted Array的C提交中击败了99.46% 的用户

    内存消耗 : 8.7 MB, 在Find First and Last Position of Element in Sorted Array的C提交中击败了78.35% 的用户

    1.先查找该值是否存在,确定一个target出现的位置n

    2.从n位置前向查找最后一个target出现的位置

    23从n位置后向查找最后一个target出现的位置

    最新回复(0)