zoukankan      html  css  js  c++  java
  • 每日二题20201117(34. 在排序数组中查找元素的第一个和最后一个位置)

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

    image-20201117145554994

    思路

    看到排序数组,基本上二分解法占一半,记得刚开始去字节面试的时候,面试官出了一题找出数组(先递增再递减)的峰值,也就是什么时候开始递减的。

    答的是扫描,那样如果峰值很靠后的话,算法不是最优解,利用二分可以达到O(logN),虽然最终在面试官的引导下一步一步写了出来,不过肯定有很多bug吧。

    好像说了许多废话,说思路,首先找到那个匹配的数字,如果找不到,直接return [-1, -1]
    
    如果找到了,2个while循环,一左一右开始找最小和最大索引。
    
    class Solution:
        def searchRange(self, nums: List[int], target: int) -> List[int]:
            low, high = 0, len(nums)-1
            # start是标志位 确认是否找到target
            start = None
            while low <= high:
                mid = (low + high) // 2
                if nums[mid] > target:
                    high = mid - 1
                elif nums[mid] < target:
                    low = mid + 1
                else:
                    start = mid
                    break
            if start is None:
                return [-1, -1]
            # 否则开始寻找两侧的节点
            left = right = start
            while left >= 0:
                # 如果左侧的不等于target了直接退出循环
                if left - 1 < 0 or nums[left-1] != target:
                    break
                left -= 1
    
            while right < len(nums):
                if right + 1 >= len(nums) or nums[right+1] != target:
                    break
                right += 1
            
            return left ,right
    
    

    image-20201117151000953

  • 相关阅读:
    归并排序
    CTE 递归
    Cordova 入门文档
    Javascript 原型链
    Windows11 正式版偷渡开启安卓子系统
    快速解决gerrit merge confict问题
    利用VPS来搭建个人主页
    检测串行序列10010
    Verilog语法总结
    深度学习中常见优化算法学习笔记
  • 原文地址:https://www.cnblogs.com/we8fans/p/14027673.html
Copyright © 2011-2022 走看看