声明:
今天是中等题第18道题。给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个按照升序排列的整数数组 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]
解法1。二分法,但因为原数组有重复元素,所以在得到了target的下标之后要看看它左右元素是否还有相等的,有的话index要做出调整,直到得到完整的区间,代码如下。
执行用时: 52 ms, 在Find First and Last Position of Element in Sorted Array的Python3提交中击败了82.35% 的用户
class Solution:
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
l,r = 0,len(nums)-1
p = -1
while l <= r: # 这里一定是<=,不只是<
mid = (l+r)//2
if nums[mid] == target:
p = mid
break # 记录下了当前等于target的index就可以退出这个循环不必遍历下去了
elif nums[mid] < target:
l = mid + 1
else:
r = mid - 1
q = p
while p > 0 and nums[p-1] == target: p -= 1
while q < len(nums)-1 and nums[q] == target: q += 1
return [p,q]
解法2。其实后面2个while循环也可以放在第一个while循环的里面,使代码看起来更剪短,如下
执行用时: 80 ms, 在Find First and Last Position of Element in Sorted Array的Python3提交中击败了8.71% 的用户
class Solution:
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
l,r = 0,len(nums)-1
while l <= r: # 再三强调这里一定要写=的情况,不然找不到
mid = (l+r)//2
if nums[mid] < target:
l = mid + 1
elif nums[mid] > target:
r = mid -1
else: # 找到了target的index即mid
l = mid
r = mid
while l > 0 and nums[l-1] == target: l -= 1
while r < len(nums)-1 and nums[r+1] == target: r += 1
return [l,r]
return [-1,-1]