Arrays 给定两个数组和一个上限,获取索引对的最有效方法是什么?对于索引对,求和最大且低于上限?
给定两个数组A和B以及一个上限k,计算索引对(i,j)的最有效方法是什么Arrays 给定两个数组和一个上限,获取索引对的最有效方法是什么?对于索引对,求和最大且低于上限?,arrays,algorithm,Arrays,Algorithm,给定两个数组A和B以及一个上限k,计算索引对(i,j)的最有效方法是什么 s = A[i] + B[j] s = max(A[a] + B[b]) for a = 0, 1, 2, .. , len(A)-1 and b = 0, 1, 2, .. , len(B)-1 and s < k s=A[i]+B[j] s=最大值(A[A]+B[B]),对于A=0,1,2,len(A)-1和b=0,1,2,len(B)-1 和 s-1和k>A[i]+B[j]>s_max: s_max=A[i
s = A[i] + B[j]
s = max(A[a] + B[b]) for a = 0, 1, 2, .. , len(A)-1 and b = 0, 1, 2, .. , len(B)-1
and
s < k
s=A[i]+B[j]
s=最大值(A[A]+B[B]),对于A=0,1,2,len(A)-1和b=0,1,2,len(B)-1
和
s
比如说,
Given,
A = [9,2,5]
B = [2,1,6]
k = 5
we get,
s = 2 + 2 = 4 < 5
and hence,
i = 1 and j = 0
给定,
A=[9,2,5]
B=[2,1,6]
k=5
我们得到,
s=2+2=4<5
因此,
i=1和j=0
所以输出应该是(1,0)
一个直接的方法将循环通过A和B的所有元素,但这将使最坏情况下的时间复杂度为O(nm),其中n=len(A)和m=len(B)
有更好的方法解决这个问题吗?您可以对a和B使用排序。然后,您可以在>=k时使用提前休息。下面的函数返回所有p
def sum小于(A,B,k):
i_max=-1
j_max=-1
s_max=-np.inf
对于枚举(a)中的i,a:
如果a+B[0]>=k:
打破
对于枚举(b)中的j,b:
如果a+b>=k:
打破
如果a+b>s_max:
s_max=a+b
i_max=i
j_max=j
返回i_max,j_max
A.排序()
B.排序()
i、 j=总和小于(A,B,k)
我也为Saurab的建议编写了代码,相对于列表中的内容,这对于大k来说要快得多。然而,根据一些示例运行,对于较短的列表或较小的k,两个for循环的速度更快
def sum小于(A,B,k):
i_max=j_max=-1
s_max=-np.inf
对于枚举(a)中的i,a:
j=二等分(B,k-a-1)
如果len(B)>j>-1和k>A[i]+B[j]>s_max:
s_max=A[i]+B[j]
i_max=i
j_max=j
返回i_max,j_max
B.排序()
i、 j=总和小于(A,B,k)
您可以对A和B使用排序。然后您可以在>=k时使用提前休息。下面的函数返回所有p
def sum小于(A,B,k):
i_max=-1
j_max=-1
s_max=-np.inf
对于枚举(a)中的i,a:
如果a+B[0]>=k:
打破
对于枚举(b)中的j,b:
如果a+b>=k:
打破
如果a+b>s_max:
s_max=a+b
i_max=i
j_max=j
返回i_max,j_max
A.排序()
B.排序()
i、 j=总和小于(A,B,k)
我也为Saurab的建议编写了代码,相对于列表中的内容,这对于大k来说要快得多。然而,根据一些示例运行,对于较短的列表或较小的k,两个for循环的速度更快
def sum小于(A,B,k):
i_max=j_max=-1
s_max=-np.inf
对于枚举(a)中的i,a:
j=二等分(B,k-a-1)
如果len(B)>j>-1和k>A[i]+B[j]>s_max:
s_max=A[i]+B[j]
i_max=i
j_max=j
返回i_max,j_max
B.排序()
i、 j=总和小于(A,B,k)
这类问题可以通过对其中一个数组进行排序来解决
一种方法是::
temp
,这样每个元组都是(值,索引)
,其中值
是B
的项,索引
是其在B中对应的索引
A
并使用二进制搜索
在临时数组中查找K-A[i]
的下限。让它位于索引j
A[i]+temp[j][0]>=K
要么
K
,则检查j-1
是否存在,如果可能,更新currentMaximum
,因为这对可以是max,同时小于K,因为我们发现了下限currentMaximum
,请存储i
和j
。
通过这种方式,您可以找到对的最大和,使其小于数组B中给定的原始索引的K
若元素的顺序和than无关,只需对B排序,并对B执行相同的步骤,而不是对temp 时间复杂性 对于排序=O(len(B)*Log(len(B))
对于遍历A并在B=O(len(A)*Log(len(B)),即O(nlog(n))上进行二进制搜索,可以通过对其中一个数组排序来解决此类问题 一种方法是::
temp
,这样每个元组都是(值,索引)
,其中值
是B
的项,索引
是其在B中对应的索引
A
并使用二进制搜索
在临时数组中查找K-A[i]
的下限。让它位于索引j
A[i]+temp[j][0]>=K
要么
K
,则检查j-1
是否存在,并在可能的情况下更新currentMaximum
,因为