【LeetCode】 34. Find First and Last Position of Element in Sorted Array (Python)

这篇博客介绍了如何解决LeetCode第34题,即在升序排列的整数数组中找到给定值的第一个和最后一个位置。作者首先解释了题目的要求,然后分享了自己的学习过程,从线性搜索、二分查找到最终使用二分法的解决方案。在分析过程中,作者提到了寻找大于和小于目标值的边界问题,并给出了错误和正确做法的示例。最后,博主强调了动手实践和理解思路的重要性。
摘要由CSDN通过智能技术生成

【LeetCode】 34. Find First and Last Position of Element in Sorted Array (Python)

题目描述

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

Medium

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]

严谨分析

作为小白的我刷这些,就一个词“懵逼”,这咋返回,要找这个数最多有几个?(我奇怪的关注点)

我学了的查找有:线性、二分、哈希——肯定用二分!我思路清晰的很嘿嘿

二分查找时mid是这个数就返回,现在要俩了,该咋弄?二分分分,我裂开来

算球了搜答案吧,哈哈哈

一百度,c++的,噢,原来有直接找大于、小于边界的函数呀,不行,我初学,要自己底层慢慢来,严肃脸。

搜下python的,噢,这呀,easy

def写写写,发呆呆,写个锤锤,再看下人家的吧,怎么忘这么快!

得了,复制下来背吧 2333333333

学渣思路

  1. 在nums里<=target的中,找索引最大的
  2. 在nums里>=target的中,找索引最小的
  3. 加个 [ ] 就它了
# python3
class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        left = self.lowwer_bound(nums, target)  # 调用时别忘 self.
        right = self.higher_bound(nums, target)
        if left == right:
            return [-1, -1]
        return [left, right - 1]  # 记得 right - 1

    def lowwer_bound(self, nums, target):
        # find 小边界 in range [left, right)
        left, right = 0, len(nums)  # 用的是 len(nums)
        while left < right:
            mid = int((left + right) / 2)  # 向下取整,所以后面left = mid + 1
            if nums[mid] < target:
                left = mid + 1  # 这里注意
            elif nums[mid] > target:
                right = mid
            else:  # nums[mid] == target: 两个函数在这里有所区别
                # 既然找到一个了,就快往左边再找找,看还有没有更小的索引对应的是target
                right = mid  
		return left  # right也行

    def higher_bound(self, nums, target):
        # find 大边界 in range [left, right)
        left, right = 0, len(nums)
        while left < right:
            mid = int((left + right) / 2)
            if nums[mid] < target:
                left = mid + 1
            elif nums[mid] > target:
                right = mid
            else:  # nums[mid] == target:
                left = mid + 1  # 往右边找有没有更大的index也是target
        return left

无数小坑

  • 考虑边界问题,比nums里所有的都小、或都大的值
  • 调用类的method忘记了加 self.
  • index是从0开始到len(nums)-1
  • 向下取整,所以后面left = mid + 1
  • nums[mid]等于target时,一个再往左找,一个再往右找
  • 最后return时,right要-1

含泪总结

  • 这些个索引、+1、-1的真滴头大,逻辑捋不清
  • 光看是学不会的,要多动手,多做多想多总结
  • 重要的是思路,有了大致方法后再着手写代码
  • 画图模拟来理清思路,边写边说以集中注意力
  • 活学活用,融会贯通,加油吧,渣渣文

代码参(fu)考(zhi)学(zhan)习(tie)的这位大神——负雪明烛的博客
https://blog.csdn.net/fuxuemingzhu/article/details/83273084

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值