63.排序数组中找元素的第一个元素和最后一个元素

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]

示例 3:

复制代码
输入:nums = [], target = 0
输出:[-1,-1]

2.代码

cpp 复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 

int find_left_bound(int* nums, int numsSize, int target){
    int left = 0;
    int right = numsSize - 1;
    int flag = 0;
    while(left <= right){
        int mid = left + (right - left )/2;
        if(nums[mid] == target){
            right = mid - 1;//找到了就往左边找左边界
            flag = 1;
        }
        if(nums[mid] > target){
            right = mid - 1;
        }
        if(nums[mid] < target){
            left = mid + 1;
        }
    } 
    //为什么会返回left呢?
    //当left == right的时候最后一次循环,如何right左移动,left才指向target
    if(flag == 0){
        return -1;
    }
    return left;
}
int find_right_bound(int* nums, int numSize, int target){
    int left = 0;
    int right = numSize - 1;
    int flag = 0;
    while(left <= right){
        int mid = left + (right - left )/2;
        if(nums[mid] == target){
            left = mid + 1;//找到了就往左边找左边界
            flag = 1;
        }
        if(nums[mid] > target){
            right = mid - 1;
        }
        if(nums[mid] < target){
            left = mid + 1;
        }
    } 
    if(flag == 0){
        return -1;
    }
    //此时返回right
    return right;
}
int* searchRange(int* nums, int numsSize, int target, int* returnSize) {
    int left_bound = find_left_bound(nums,numsSize,target);
    int right_bound = find_right_bound(nums,numsSize,target);
    int* res = (int*)malloc(sizeof(int)*2);
    res[0] = left_bound;
    res[1] = right_bound;
    returnSize[0] = 2;
    return res;
}
相关推荐
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局2 天前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象2 天前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局2 天前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局2 天前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法
统计实现局2 天前
为什么 Cholesky 求逆比 Gauss-Jordan 快一倍——行列式溢出防护详
算法