LeetCode找元素Find First and Last Position of Element in Sorted Array

Posted 华不摇曳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode找元素Find First and Last Position of Element in Sorted Array相关的知识,希望对你有一定的参考价值。

描述:

Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm‘s runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

Example 2:

Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]

 

思路一:一次Binary Search

先使用二分查找找到和taget相等的起始位置的元素,然后在这个位置向两边扩散找到值相同的范围。

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res(2,-1);
        if(nums.size() == 0) return res;
        int cau = dichotomy(nums,target);
        if(cau == -1) return res;
        else{
            int i = cau,j = cau;
            cout<<cau<<endl;
            while((i>=0 && nums[i] == target) || (j<=nums.size()-1 && nums[j] == target)){
                if(i>=0 && nums[i] == target){
                    res[0] = i;
                    cout<<i<<endl;
                    i--;
                }
                if(j<=nums.size()-1 && nums[j] == target){
                    res[1] = j;
                    cout<<j<<endl;
                    j++;
                }
            }
        }
        return res;
    }
    
    int dichotomy(vector<int>& nums, int target){
        int low = 0,int high = nums.size() - 1;
        while(low < high){
            int mid = (low + high + 1) / 2;
            if(nums[mid] == target) return mid;
            if(nums[mid] < target) low = mid + 1;
            else high = mid - 1;
        }
        return -1;
    }
};

 

思路二:两3次Binary Search

先根据上述的二分查找,找到起始位置的元素,然后从low开始继续使用一次二分查找找到target+1的位置,然后返回这个位置it - 1,从而找到起始和终止的范围。

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res(2,-1);
        if(nums.size() == 0) return res;
        int low = dichotomy(nums,target,0);   //找起始元素
        cout<<low<<endl;
        if(low == nums.size() || nums[low] != target)  //可能出现到数组结尾还是target比low处元素大,low=nums.size
            return res;
        else{
            res[0] = low;
            res[1] = dichotomy(nums,target+1,low) - 1;   //找结尾元素
        }
        return res;
    }
    
    int dichotomy(vector<int>& nums, int target, int low){
        int high = nums.size(); //核心  
        while(low < high){
            int mid = (low + high ) / 2;  
            if(nums[mid] < target) low = mid + 1;
            else high = mid;
        }
        return low;
    }
};

 

以上是关于LeetCode找元素Find First and Last Position of Element in Sorted Array的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 34. Find First and Last Position of Element in Sorted Array

LeetCode 34. Find First and Last Position of Element in Sorted Array

34. Find First and Last Position of Element in Sorted Array

[二分搜索] leetcode 34 Find First and Last Position of Element in Sorted Array

[leetcode][34] Find First and Last Position of Element in Sorted Array

Leetcode 34 Find First and Last Position of Element in Sorted Array 解题思路 (python)