在排序数组中查找元素的第一个和最后一个位置「掘金日新计划 · 12 月更文挑战」

107 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

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

题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [−1,−1]。请设计并实现时间复杂度为 O(log n) 的算法解决此问题。

输入格式

两行,第一行输入两个以空格分隔的整数 n(1≤n≤105) 和 target(−10^5≤target≤10^5),第二行输入一个长度为 n 、以空格分隔的整数数组 nums(−10^5≤nums[i]≤10^5)。

输出格式

一行,输出开始位置索引和结束位置索引,以空格分隔。

样例

输入数据 1

6 8
5 7 7 8 8 10

输出数据 1

3 4

输入数据 2

6 6
5 7 7 8 8 10

输出数据 2

-1 -1

思路

这个题思路很简单,已经给出了升序排列的数组,也有目标值,而且仔细看了数组范围,发现范围都很小,那么就直接从数组第一个元素一直搜索到最后一个,可能也不需要到最后一个,只要搜到的数已经等于需要搜索的数,就继续搜索,搜索到下一个不相等的数了,就可以直接break了,因为数组是升序排列。如果从第一个元素一直搜索到最后一个元素都没有等于target的数,就可以输出-1 -1,即没有找到target。这个题算是超级超级入门的题目了吧,qwq。

代码

#include<stdio.h>
int main(){
    int n,t;
    scanf("%d %d",&n,&t);
    int num[1000000];
    for(int i=0;i<n;i++)
    scanf("%d",&num[i]);
    int f=0,flag=-1;
    for(int i=0;i<n;)
    {
        if(num[i]==t&&flag==-1){flag=i;}
        else if(num[i]!=t&&flag!=-1){f=i-1;break;}
        i++;
    }
    if(flag!=-1)printf("%d %d",flag,f);
    else printf("-1 -1");
    return 0;
}