算法学习打卡计划

leetcode第三十四题 —— 排序数组查找元素位置

2019-12-20  本文已影响0人  不分享的知识毫无意义

1.题目

原题:

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

例子:

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

2.解析

这道问题明确要求时间复杂度是O(logn)级别的,就是要求用二分法进行求解,二分法求解的一般思路是设置一个左指针和右指针,然后跟中间的指针比较,更新左右指针,直至左指针和右指针相等。
放到这道题有三种情况:
(1)target<nums[mid]:right = mid -1
(2)target>nums[mid]:left = mid+1
(3)target = nums[mid+1]:遍历满足条件的最大值和最小值

3.python代码

class Solution:
    def searchRange(self, nums, target):
        if target not in nums:
            return [-1, -1]
        llen = len(nums) - 1
        left = 0
        right = llen
        while right >= left:
            mid = (right + left) // 2
            if target < nums[mid]:
                right = mid - 1
            elif target > nums[mid]:
                left = mid + 1
            else:
                r = mid
                l = mid
                # print(r, l)
                while l - 1 >= 0 and target == nums[l - 1]:
                    l -= 1
                while r + 1 <= llen and target == nums[r + 1]:
                    r += 1
                return [l, r]
上一篇下一篇

猜你喜欢

热点阅读