Search for a Range 排序vector查找指定数字的起始位置终止位置

思路先确定是否存在目标数字,在目标数字的左端寻找最小位置,在目标数字的最右端寻找最大位置,通过二分查找,时间复杂度限定在O(logn)

class Solution {

public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int len = nums.size();
        vector<int> ans;
        int firstindex = findFirstindex(nums,target);
        if(firstindex==-1){
            ans.push_back(-1);
            ans.push_back(-1);
            return ans;
        }
        int minindex = getMinindex(nums,0,firstindex-1,target);
        int maxindex = getMaxindex(nums,firstindex+1,len-1,target);
        if(minindex==-1&&maxindex==-1){
            ans.push_back(firstindex);
            ans.push_back(firstindex);
        }
        else if(minindex==-1&&maxindex!=-1){
            ans.push_back(firstindex);
            ans.push_back(maxindex);
        }
        else if(minindex!=-1&&maxindex==-1){
            ans.push_back(minindex);
            ans.push_back(firstindex);
        }
        else{
            ans.push_back(minindex);
            ans.push_back(maxindex);
        }
        return ans;
    }
private:
    int findFirstindex(vector<int>& nums,int target){
        int i =0;
        int j = nums.size()-1;
        int index;
        while(i<=j){
            index = (i+j)/2;
            if(nums[index]==target){
                return index;
            }
            else if(nums[index]<target){
                i = index+1;
            }
            else{
                j = index-1;
            }
        }
        return -1; //无此元素
    }
    int getMinindex(vector<int>& nums,int start,int end,int target){
        if(nums[end]<target||end<start){
            return -1;
        }
        while(nums[start]!=nums[end]){
            int index = (start+end)/2;
            if(nums[index]<target&&index+1<end){
                start = index;
            }
            else if(nums[index]<target&&index+1==end){
                start = index+1;
            }
            else{
                if(index-1>start){
                    end = index;
                }
                else{
                    return nums[index]==nums[start]?start:index;
                }
            }
        }
        if(nums[start]==target)
            return start;
        return -1;
    }
    int getMaxindex(vector<int>& nums,int start,int end,int target){
        if(nums[start]>target||start>end){
            return -1; //-1代表右端没有相同的值,如果不进入该if,左端start元素必定为target
        }
        while(nums[end]!=nums[start]){
            int index = (start+end)/2;
            if(nums[index]>target&&index-1>start){
                end = index;
            }
            else if(nums[index]>target&&index-1==start){
                end = index-1;
            }
            else{
                if(index+1<end){
                    start = index;
                }
                else{
                    return nums[index]==nums[end]?end:index;
                }
            }
        }
        if(nums[end]==target)
            return end;
        return -1;
    }
};

猜你喜欢

转载自blog.csdn.net/qianli2333/article/details/80589596
今日推荐