1. 二分查找(时间复杂度O(log n))
class Solution(object):
def search(self, nums, target):
low=0
high=len(nums)-1
while(low<=high):
mid=(low+high)//2
if nums[mid]==target:
return mid
elif nums[mid]>target:
high=mid-1
else:
low=mid+1
return -1
1.1 leetcode 16.06最小差(排序+二分 O(n*log m))
给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差
输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}
输出:3,即数值对(11, 8)
class Solution(object):
def smallestDifference(self, a, b):
# 将a中的每个元素作为target,从b中找与它差值最小的值
b.sort()
len_a=len(a)
min=-1
for i in range(len_a):
low = 0
high = len(b) - 1
while(low<=high):
mid=(low+high)//2
if b[mid]==a[i]:
return 0
elif b[mid]>a[i]:
high=mid-1
else:
low=mid+1
if a[i]>b[mid]: # target比当前的数大,分别比较当前位置和后一位与target的差值
if mid==len(b)-1: # 若当前位置在尾部
bias=abs(a[i]-b[mid])
else: # 若当前位置不在尾部
bias1=abs(a[i]-b[mid])
bias2=abs(a[i]-b[mid+1])
bias=bias1 if bias1bias:
min=bias
elif a[i]bias:
min=bias
return min
1.2 leetcode16.21.交换和:
给定两个整数数组,交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。若无满足条件的数值,返回空数组。
输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]
输出: [1, 3]
输入: array1 = [1, 2, 3], array2 = [4, 5, 6]
输出: []
# array1减去几,array2就得加几,所以差的数就得是2的倍数
class Solution(object):
def findSwapValues(self, array1, array2):
sum1=sum(array1)
sum2=sum(array2)
if abs(sum1-sum2)%2==1:
return []
array1.sort()
array2.sort()
bias=abs(sum1-sum2)/2
for elem in array1:
if sum1<=sum2:
target=elem+bias
else:
target=elem-bias
low=0
high=len(array2)-1
while(low<=high):
mid=(low+high)//2
if array2[mid]==target:
return [elem,array2[mid]]
elif array2[mid]>target:
high=mid-1
else:
low=mid+1
return []
1.3 狒狒吃香蕉(https://leetcode-cn.com/problems/nZZqjQ/)
N堆香蕉,第i堆中有piles[i]根香蕉,在H小时内吃完,吃香蕉的速度 K (单位:根/小时)。每小时选择一堆香蕉吃掉k根,每个小时最多吃掉1堆, 狒狒喜欢慢慢吃,但仍想在H小时内吃完。
返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。
输入: piles = [3,6,7,11], H = 8
输出: 4
输入: piles = [30,11,23,4,20], H = 5
输出: 30
输入: piles = [30,11,23,4,20], H = 6
输出: 23
# 1=h: #速度需要加快 mid