I、題する説明
与えられた値の開始と終了を見つけ、ソート配列の要素の最初と最後の位置を34検索と題され、時間の複雑さはOLOG(n)が必要です。対象の難易度は中です!
第二に、私の答え
被験体または二分探索(バイナリサーチ)は、わずかに少し変更しました。ターゲット== NUMS [中間]した後、上記の必要性があれば後者の値=目標、検索します。
書かれたら、バグ無料、習うより慣れろ!どのようにクールなジレ!
#include<iostream>
#include<vector>
using namespace std;
class Solution{
public:
vector<int> searchRange(vector<int>& nums, int target){
vector<int> res;
if(nums.size()<1){
res.push_back(-1);
res.push_back(-1);
return res;
}
int begin = 0;
int end = nums.size()-1;
int mid = -1;
while(begin <= end){
mid = (begin + end) / 2;
if(nums[mid] == target){
begin = mid;
while(begin>0 && nums[begin] == target){
begin--;
}
if(nums[begin]==target){
res.push_back(begin);
}else{
res.push_back(begin+1);
}
end = mid;
while(end<nums.size()-1 && nums[end] == target){
end++;
}
if(nums[end]==target){
res.push_back(end);
}else{
res.push_back(end-1);
}
return res;
}else if(nums[mid] < target){
begin = mid + 1;
}else{
end = mid - 1;
}
}
//未找到
res.push_back(-1);
res.push_back(-1);
return res;
}
};
int main(){
Solution s;
vector<int> nums = {5,7,7,8,8,10};
vector<int> r = s.searchRange(nums,8);
for(vector<int>::iterator it=r.begin();it!=r.end();it++){
cout<<*it<<" ";
}
r = s.searchRange(nums,6);
for(int i=0;i<r.size();i++){
cout<<r[i]<<" ";
}
return 0;
}
コードパフォーマンス:
Runtime: 12 ms, faster than 38.75% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.4 MB, less than 70.33% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
第三に、改善
トピックでは、我々は、ことがわかったmid = begin + (end - begin) / 2;
性能比がmid = (begin + end) / 2
非常に高いです。
パフォーマンスを向上させるには:
Runtime: 8 ms, faster than 86.11% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.4 MB, less than 82.42% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
これはまさに、なぜ、誰が神の指導、助言です。感謝します!!!
ここでは言及しないでくださいmid = (begin + end) / 2
オーバーフローする可能性があります。。。