LeetCode 34*. 在排序数组中查找元素的第一个和最后一个位置(Python)

简介: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。

给定一个按照升序排列的整数数组 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]



使用两个二分查找,第一个二分找第一个出现的位置,第二个二分找最后一个出现的位置。即使使用了两个二分查找,时间复杂度仍为 log(n).


步骤:


①找第一个出现的位置,当 arr[mid] == target && target > arr[mid-1] 说明 mid 就是第一个出现的位置,否则递归调用,不断向前缩小范围,最后考虑边界,即 mid == 0,此时如果 arr[mid] == target 就返回 0,否则返回 -1.


②找最后一个出现的位置,当 arr[mid] == target && target < arr[mid + 1] 时,说明 mid 就是最后一个出现的位置,否则递归调用,不断向后缩小范围,最后考虑边界情况,即 mid == end 时,此时如果 arr[mid] == target 就返回 end,否则返回 -1.  


class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        first = self.searchFirst(nums, 0, len(nums) - 1, target)
        last = self.searchLast(nums, 0, len(nums) - 1, target)
        return [first, last]
    def searchFirst(self, nums, start, end, target):
        if end >= start:
            mid = int((start + end) / 2)
            if nums[mid] == target and (mid == 0 or target > nums[mid - 1]):
                return mid
            elif nums[mid] < target:
                return self.searchFirst(nums, mid + 1, end, target)
            else:
                return self.searchFirst(nums, start, mid - 1, target)
        return -1
    def searchLast(self, nums, start, end, target):
        if end >= start:
            mid = int((start + end) / 2)
            print(mid)
            if nums[mid] == target and (mid == end or target < nums[mid + 1]):
                            return mid
            elif nums[mid] <= target:   # 注意与搜索第一个数的区别
                return self.searchLast(nums, mid + 1, end, target)
            else:
                return self.searchLast(nums, start, mid - 1, target)
        return -1


相关文章
|
2月前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
50 1
|
3月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
104 10
|
3月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
136 4
|
3月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
84 0
|
4月前
|
Python
Python中几种lambda排序方法
【9月更文挑战第7天】在Python中,`lambda`表达式常用于配合排序函数,实现灵活的数据排序。对于基本列表,可以直接使用`sorted()`进行升序或降序排序;处理复杂对象如字典列表时,通过`lambda`指定键值进行排序;同样地,`lambda`也适用于根据元组的不同位置元素来进行排序。
147 1
|
4月前
|
数据处理 Python
python遍历文件夹所有文件按什么排序
python遍历文件夹所有文件按什么排序
31 0
|
4月前
|
数据处理 Python
Python遍历文件夹所有文件并按指定排序
Python遍历文件夹所有文件并按指定排序
96 0
|
测试技术 Android开发 Python
|
开发框架 测试技术 索引
Python+Appium自动化测试(5)-appium元素定位常用方法(二)
appium继承了selenium框架中webdriver提供的元素定位方法,接下介绍几种常用的方法。
Python+Appium自动化测试(5)-appium元素定位常用方法(二)
|
测试技术 开发工具 Android开发
Python+Appium自动化测试(5)-appium元素定位常用方法(一)
对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor。之前已经介绍过了weditor的使用,这里我将通过使用uiautomatorview工具查看元素的属性值,来介绍Android app通过appium进行元素定位常用的几种方法。
Python+Appium自动化测试(5)-appium元素定位常用方法(一)