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

180 阅读1分钟

题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。

进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?  

示例

示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/fi…

实现

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    int *result = (int *)malloc(sizeof(int) * 2);
    *returnSize = 2;
    result[0] = -1;
    result[1] = -1;
    if (numsSize == 0) {
        return result;
    }
    if (numsSize == 1) {
        if (nums[0] == target) {
            result[0] = 0;
            result[1] = 0;
        }
        return result;
    }
    int l = 0;
    int r = numsSize - 1;
    int mid = 0;
    while (l <= r) {
        mid = (l + r) / 2;
        if (nums[mid] > target) {
            r = mid - 1;
        } else if (nums[mid] < target) {
            l = mid + 1;
        } else {
            int left = mid;
            int right = mid;
            while ((left - 1) >= l && nums[left-1] == target) {
                left--;
            }
            while ((right + 1) <= r && nums[right+1] == target) {
                right++;
            }
            result[0] = left;
            result[1] = right;
            *returnSize = 2;
            return result;
        }
    }
    return result;
}