给你一个n代表有一个长度为n的有序数组,然后给你一个k,你需要判断这个k是否在数组里面,
如果存在就返回这个数从左往右第一次出现位置的下标,如果不存在输出-1
第一行输入一个n,k,其中n代表有n个数字,k代表你需要查找的元素第二行输入n个数
如果在数组里面找到了k,输出k所在的下标(注:如果数组中k出现了多次,请输出最小的下标!),如果k不在,就输出-1
7 0 0 1 2 3 4 5 6
0
8 9 0 1 2 3 4 5 6 7
-1
#include <iostream> #include <vector> using namespace std; //快速排序代码--这道题因为 给的数据是有序的的所以不用排序 void Mysort(vector<int>&a,int begin,int end){ //左闭右开的 if(begin==end){ return; } int left=begin; int right=end-1; int temp=a[left]; while(left<right){ while(left<right&&a[right]>temp){ right--; } a[left]=a[right]; while(left<right&&a[left]<temp){ left++; } a[right]=a[left]; } a[left]=temp; Mysort(a,begin,left); Mysort(a,left,end-1); } //返回第一个出现的下标--那在这里使用二分来进行查找时间复杂度为log N int Get(vector<int>&nums,const int &val){ int left=0,right=nums.size(); //使用左闭右开的区间范围,所以这里循环的终止条件是left==right [1,1) while(left<right){ int mid=left+(right-left)/2; if(nums[mid]==val){ //等于val的时,那么我们就需要在[left,mid)这个区间继续找是否存在 ==val的值 找到左边界 right=mid; }else if(nums[mid]>val){ //如果mide>val时就在 [left,mid)区间查找,注意这里同样 左闭右开区间 nums[mid]>val; right=mid; }else if(nums[mid]<val){ //如果mid小于目标值,那么就在[mid+1,right)注意这里坚持了左闭右开 的区间原则 left=mid+1; } } if(nums[left]==val){ return left; } return -1; } int main(){ //n几个数字,x目标值 int n,x; cin>>n>>x; vector<int>arr; //用vector来保存输入的数据 int temp; for(int i=0;i<n;i++){ cin>>temp; arr.push_back(temp); } // Mysort(arr,0,arr.size()); temp= Get(arr,x); cout<<temp; return 0; }