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;
}
相关推荐
Tisfy几秒前
LeetCode 0301.删除无效的括号:二进制枚举 / 回溯
算法·leetcode·字符串·题解·回溯·括号匹配·二进制枚举
Nil2088 分钟前
leetcode 322零钱兑换
算法·leetcode·职场和发展
海绵宝宝转agent13 分钟前
2026-10-9 leetcode100刷题+面经整理
笔记·算法·面试
yi01123 分钟前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
木井巳24 分钟前
【BFS 解决拓扑排序】课程表
java·算法·leetcode·广度优先·宽度优先·推荐算法·图搜索算法
扶风ff44 分钟前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
yi0111 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
-dzk-1 小时前
【多维动态规划】LC 1143.最长公共子序列
算法·动态规划
C++ 老炮儿的技术栈1 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
Omics Pro1 小时前
全新可重分析!代谢组质谱专用
数据库·人工智能·算法·机器学习·自然语言处理