[编程题]数字在排序数组中出现的次数
样例 8
1 2 3 3 3 3 4 5 3
链接:https://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2?orderByHotValue=1&page=8&onlyReference=false 来源:牛客网 class Solution { public: int erfen(vector<int>data,double k){ int l = 0; int r = data.size()-1; while(l<=r){ int mid = (l+r)/2; if(data[mid]<k)l = mid+1; else r = mid-1; } return l; } int GetNumberOfK(vector<int> data ,int k) { int p1 = erfen(data,k+0.5); int p2 = erfen(data,k-0.5); // cout<<p1-p2<<endl; return p1-p2; } };
#include<bits/stdc++.h> using namespace std; vector<int>vc; class Solution { public: int erfen_first(vector<int> data ,int l,int r,double k){ if(l>=r){ if(data[l]==k)return l; else return -1; } int mid = (l+r)/2; if(data[mid]<k)return erfen_first(data,mid+1,r,k); else return erfen_first(data,l,mid,k); } // 1 2 3 3 4 5 int erfen_last(vector<int> data ,int l,int r,double k){ if(l>=r){ if(data[l]==k)return l; if(data[l-1]==k)return l-1; else return -1; } int mid = (l+r)/2; if(data[mid]<=k)return erfen_last(data,mid+1,r,k); else return erfen_last(data,l,mid,k); } //1 2 3 3 3 4 5 int GetNumberOfK(vector<int> data ,int k) { auto pp = equal_range(data.begin(),data.end(),k); return pp.second-pp.first; int len = data.size(); if(len==0)return 0; int pos = erfen_first(data,0,len-1,k); if(pos!=-1) { int pos2 = erfen_last(data,0,len-1,k); // cout<<pos<<" "<<pos2<<endl; return pos2-pos+1; } else return 0; } }; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ int num; cin>>num; vc.push_back(num); } int k; cin>>k; Solution ss; int an = ss.GetNumberOfK(vc,k); cout<<an<<endl; return 0; }