如何加快以下问题陈述的执行速度?我有一个正确的解决方案,通过每一个测试的小输入。但是,它超过了较大输入的时间限制。我当前的实现是数组大小的二次型。
你的答案应该是基于1的,这意味着数组的第一个位置是1而不是0。
实施
def findLongestSubarrayBySum(s, arr):
"""Return a two-element array that represent the bounds of the subarray."""
ans = [-1]
for left in range(len(arr)):
curr_sum = arr[left]
if curr_sum == s and len(ans) == 1:
ans = [left + 1] * 2
for right in range(left + 1, len(arr)):
curr_sum += arr[right]
if curr_sum == s:
# First found soltion
if len(ans) == 1:
ans = [left + 1, right + 1]
# Left bound is right bound
elif ans[1] == ans[0]:
ans = [left + 1, right + 1]
# Longer subarray
elif ans[1] - ans[0] < right - left:
ans = [left + 1, right + 1]
elif curr_sum > s:
break
return ans
if __name__ == '__main__':
# s = 12 # ans = [2, 4]
# arr = [1, 2, 3, 7, 5]
# s = 15 # ans = [1, 5]
# arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# s = 15 # ans = [1, 8]
# arr = [1, 2, 3, 4, 5, 0, 0, 0, 6, 7, 8, 9, 10]
# s = 3 # ans = -1
# arr = [1, 1]
# s = 3 # ans = -1
# arr = [2]
# s = 468 # ans = [42, 46]
# arr = [135, 101, 170, 125, 79, 159, 163, 65, 106, 146, 82, 28,
# 162, 92, 196, 143, 28, 37, 192, 5, 103, 154, 93, 183, 22,
# 117, 119, 96, 48, 127, 0, 172, 0, 139, 0, 0, 70, 113, 68,
# 100, 36, 95, 104, 12, 123, 134]
# s = 3 # ans = [1, 1]
# arr = [3]
# s = 0 # ans = [2, 2]
# arr = [1, 0, 2]
s = 3 # ans = [1, 3]
arr = [0, 3, 0]
print(findLongestSubarrayBySum(s, arr))
如果输入包含负数,则在概念上使用前缀和,在实践中使用哈希表。prefixes_j-prefixes_i=s
。对于每个prefixes_j
,它只是一个单一的累加和,检查hash表中是否存在键prefixes_j-s
;之后,如果表中不存在和,则将其作为指向当前索引的键插入。存储在该键的值将是看到前缀和的第一个索引,这样,最左边的索引将返回重复的索引。
[1, 2, 3, 7, 5] s = 12
sum 1
hash 1
sum 3
hash 1, 3
sum 6
hash 1, 3, 6
sum 13
hash contains 1
found 13 - 12 = 1
record length 3
etc...
如果输入不包含负数,可以使用这样的思想,即右指针可以在和超过s时立即停止,然后递增左指针,直到它再次变小,以这种方式交替指针递增,这样每个指针总共遍历列表一次。
本文向大家介绍LCM的最大长度子数组等于C ++中的乘积,包括了LCM的最大长度子数组等于C ++中的乘积的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数组A。我们必须找到子数组的最大长度,它的LCM与该子数组元素的乘积相同。如果找不到这种子数组,则返回-1。假设数组为{6,10,21},则长度为2,因为在那里有子数组{10,21},其LCM为210,乘积也为210。 该方法是直接的。我
考虑一个由 N 个整数组成的数组。找到最长的连续子数组,使其元素的平均值大于(或等于)给定数字 k。 显而易见的答案具有O(n^2)复杂度。我们能做得更好吗?
问题是要找出A和B(包括A和B)之间的数字总数等于S。 同时打印A和B(含)之间的最小数字。 输入: 由A、B、S组成的单线。 输出: 两行。 在第一行中,A和B之间的整数数,其位数之和等于S。 在第二行中,A和B之间的最小数字。 约束: 1. 1. 来源:黑客地球 我的解决方案只适用于30%的输入。对此最好的解决方案是什么? 我现在使用的算法计算最小数字的和,然后在十位数的每次更改后再次计算和。
我遇到了以下问题: 给定一个整数数组,一个正整数和一个整数,您的任务是查找长度不大于且和等于的非空连续子阵列的数量。 对于< code>arr = [1,2,4,-1,6,1],< code>k = 3,以及< code>s = 6,输出应为< code >解(arr,k,s) = 3。 长度和等于的连续子数组之间存在子数组,它是, 长度和等于的连续子数组之间存在子数组,它是, 长度和等于的连续子
我们将如何测试数组中每个子数组的长度等于子数组元素之和的P倍的所有子数组组合。 一个简短的示例:编辑: 期望的结果: 长度=2,P*元素之和=1。子序列是 编辑约束: 这些问题属于什么样的问题集(例如:NP-hard?)?语言:C#
我可以搜索eqaul到k之和的子数组中的正数,但下面的代码无法搜索数组中的负数。对于数组中的负数和正数,有没有找到给定和的子数组的算法? 例如,{10,2,-2,-20,10},在这个数组中查找sum为-10的子数组。子数组在这种情况下是{-20,10}。