【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
学渣思路
- 在nums里<=target的中,找索引最大的
- 在nums里>=target的中,找索引最小的
- 加个 [ ] 就它了
# 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