4
题目描述:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
示例:
解答:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
'''
取两个数组中的第k/2个元素进行比较,
如果数组1的元素小于数组2的元素,则说明数组1中的前k/2个元素不可能成为第k个元素的候选,
所以将数组1中的前k/2个元素去掉,组成新数组和数组2求第k-k/2小的元素,
因为我们把前k/2个元素去掉了,所以相应的k值也应该减小。
另外就是注意处理一些边界条件问题,比如某一个数组可能为空或者k为1的情况。
'''
def findKthElement(arr1,arr2,k):
len1,len2 = len(arr1),len(arr2)
if len1>len2:
return findKthElement(arr2,arr1,k)
if not arr1:
return arr2[k-1]
if k == 1:
return min(arr1[0],arr2[0])
i,j = min(k//2,len1)-1,min(k//2,len2)-1
if arr1[i] > arr2[j]:
return findKthElement(arr1,arr2[j+1:],k-j-1)
else:
return findKthElement(arr1[i+1:],arr2,k-i-1)
l1,l2 = len(nums1),len(nums2)
left,right = (l1+l2+1)//2,(l1+l2+2)//2
return (findKthElement(nums1,nums2,left)+findKthElement(nums1,nums2,right))/2
278
题目描述;
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例:
解答:
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return an integer
# def isBadVersion(version):
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
high=n
low=1
while low<high:
mid=(low+high)//2
if isBadVersion(mid):
high=mid
else:
low=mid+1
return low
374
题目描述:
猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
示例:
解答:
# The guess API is already defined for you.
# @param num, your guess
# @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
# def guess(num: int) -> int:
class Solution:
def guessNumber(self, n: int) -> int:
left=1
right=n
while left<right:
mid=(left+right)//2
res=guess(mid)
if res==1:
left=mid+1
else:
right=mid
return left
852
题目描述:
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i 。
示例:
解答:
class Solution:
def peakIndexInMountainArray(self, arr: List[int]) -> int:
'''
return arr.index(max(arr))
'''
n=len(arr)
left,right=0,n-1
while left<=right:
mid=(left+right)//2
if arr[mid-1]<arr[mid] and arr[mid]>arr[mid+1]:
return mid
elif arr[mid-1]<arr[mid] and arr[mid]<arr[mid+1]:
left=mid+1
else:
right=mid-1
1095
题目描述:
(这是一个 交互式问题 )
给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。
如果不存在这样的下标 index,就请返回 -1。
何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:
首先,A.length >= 3
其次,在 0 < i < A.length - 1 条件下,存在 i 使得:
A[0] < A[1] < … A[i-1] < A[i]
A[i] > A[i+1] > … > A[A.length - 1]
你将 不能直接访问该山脉数组,必须通过 MountainArray 接口来获取数据:
MountainArray.get(k) - 会返回数组中索引为k 的元素(下标从 0 开始)
MountainArray.length() - 会返回该数组的长度
示例:
解答:
# """
# This is MountainArray's API interface.
# You should not implement it, or speculate about its implementation
# """
#class MountainArray:
# def get(self, index: int) -> int:
# def length(self) -> int:
class Solution:
def findInMountainArray(self, target: int, mountain_arr: 'MountainArray') -> int:
n = mountain_arr.length()
left, right = 0, n - 1
# 二分寻找山顶(162,寻找峰值)
while(left < right):
mid = (left + right + 1) >> 1
# 左边有序, 可以排除 0 ~ i -1
if mountain_arr.get(mid) > mountain_arr.get(mid - 1):
left = mid
else:
right = mid - 1
top_idx = left
# # 在左边寻找 >= target 的左边界
left, right = 0, top_idx
while(left < right):
mid = (left + right) >> 1
if mountain_arr.get(mid) >= target:
right = mid
else:
left = mid + 1
# 刚好等于 target, 直接返回
if (mountain_arr.get(left) == target):
return left
# 右边找 <= target 的左边界
left, right = top_idx, n - 1
while(left < right):
mid = (left + right) >> 1
if mountain_arr.get(mid) <= target:
right = mid
else:
left = mid + 1
return left if mountain_arr.get(left) == target else -1