开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}