LeetCode算法题34:在排序数组中查找元素的第一个和最后一个位置解析

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

明显是二分法的题,既然有两个边界,那就找两次,第一次找左边,第二次找右边,要注意的一点是,由于计算中间值时除法是向下取整的,所以只能从左边向右靠近,所以都是left+1的情况,其余的一些细节直接见程序即可。
C++源代码:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res(2,-1);
        if(nums.size()==0) return res;
        int left = 0, right = nums.size()-1;
        while(left < right)
        {
            int mid = left + (right-left) / 2;
            if(nums[mid] < target)
                left = mid + 1;
            else
                right = mid;
        }
        if(target!=nums[left])
            return res;
        res[0] = left;
        right = nums.size();
        while(left < right)
        {
            int mid = left + (right-left) / 2;
            if(nums[mid] <= target)
                left = mid+1;
            else
                right = mid;
        }
        res[1] = right-1;
        return res;
        
    }
};

python3源代码:

class Solution:
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        res = [-1, -1]
        if len(nums)==0: return res
        left = 0
        right = len(nums)-1
        while left < right:
            mid = left + (right-left) // 2
            if nums[mid] < target:
                left = mid+1
            else:
                right = mid
        if nums[left]!=target: return res
        res[0] = left
        right = len(nums)
        while left < right:
            mid = left + (right-left) // 2
            if nums[mid] <= target:
                left = mid + 1
            else:
                right = mid
        res[1] = right - 1
        return res

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/84847512
今日推荐