Leetcode 刷题笔记 binary search
二分法
- l = 0, r = 0, mid = (l + r) // 2
- 二分法就是首尾双指针 (每轮移位为一个区间)
- nums[mid] > target >>> r = mid - 1;else: l = mid + 1
- 时间复杂度 O(logn)
34. Find First and Last Position of Element in Sorted Array(medium)
https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
l = 0
r = len(nums) - 1
res = -1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
res = mid
break
elif nums[mid] > target:
r = mid - 1
else:
l = mid + 1
if res == -1:
return [-1, -1]
#step 1 [l, res]--> 有几个res即[1,...,res,res,res]
l = 0
r = res
l_bound = 0
r_bound = 0
while l <= r:
mid = (l+r)//2
if nums[mid] == target:
r = mid - 1
l_bound = mid
else:
l = mid + 1
l = res
r = len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
r_bound = mid
l = mid + 1
else:
r = mid - 1
return [l_bound, r_bound]
三轮二分,
- 第一轮确认一个target的位置作为mid
- 第二轮确认[l , mid] 中间是否还有target
- 第三轮[mid , r] 中间是否有target
69. Sqrt(x) (easy)
https://leetcode.com/problems/sqrtx/
class Solution:
def mySqrt(self, x: int) -> int:
l = 0
r = x
while l <= r:
mid = (l + r) // 2
if mid * mid == x:
return mid
elif mid * mid > x:
r = mid - 1
else:
l = mid + 1
return r
因为题目取下界故 return r,
因为while循环的推出时[r , l] >>> 为所取平方根的区间
4. Median of Two Sorted Arrays (Hard)
https://leetcode.com/problems/median-of-two-sorted-arrays/
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
nums1.extend(nums2)
nums1.sort()
if len(nums1) % 2 == 1:
return nums1[len(nums1) // 2]
else: #[0,1,2,3] 4/2 = 2
return ( nums1[len(nums1) // 2] + nums1[len(nums1) // 2 - 1] ) / 2
用py的函数取个巧
34. Find First and Last Position of Element in Sorted Array(medium)
https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
l = 0
r = len(nums) - 1
rst = -1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
rst = mid
break
elif nums[mid] > target:
r = mid - 1
else:
l = mid + 1
if rst == -1:
return [-1, -1]
l = 0
r = rst
l_bound = 0
r_bound = 0
# left side
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
#[l,mid,rst] --> [mid, rst] = target
l_bound = mid
r = mid - 1
else:
#[l, mid, target=rst]
l = mid + 1
# right side
l = rst
r = len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
#[rst, mid, r]
r_bound = mid
l = mid + 1
else:
r = mid - 1
return [l_bound, r_bound]
540. Single Element in a Sorted Array (medium)
https://leetcode.com/problems/single-element-in-a-sorted-array/
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
l = 0
r = len(nums) - 1
while l < r:
mid = (l + r) // 2
if mid % 2 == 1:
mid -= 1
if nums[mid] == nums[mid+1]:
l = mid + 2
else:
r = mid
return nums[l]
偶数位后续为相同的数,即nums[even] == nums[even + 1] >>> 左边有序
反之,右边有序
例子如下:
- [1,1,2,3,3],2≠3 >>> 无序的出现在[l, mid]
- [1,1,2,2,3],2=2 >>> 无序的出现在[mid, r]