刷题34。ソートされた配列に要素の最初と最後の位置を探します

I、題する説明

与えられた値の開始と終了を見つけ、ソート配列の要素の最初と最後の位置を34検索と題され、時間の複雑さはOLOG(n)が必要です。対象の難易度は中です!

第二に、私の答え

被験体または二分探索(バイナリサーチ)は、わずかに少し変更しました。ターゲット== NUM​​S [中間]した後、上記の必要性があれば後者の値=目標、検索します。

書かれたら、バグ無料、習うより慣れろ!どのようにクールなジレ!

#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オーバーフローする可能性があります。

おすすめ

転載: www.cnblogs.com/siweihz/p/12238627.html
おすすめ