我遇到了以下问题:
给定一个整数数组arr
,一个正整数k
和一个整数s
,您的任务是查找长度不大于k
且和等于s
的非空连续子阵列的数量。
对于< code>arr = [1,2,4,-1,6,1],< code>k = 3,以及< code>s = 6,输出应为< code >解(arr,k,s) = 3。
1
和等于s=6
的连续子数组之间存在1
子数组,它是[6]
,2
和等于s=6
的连续子数组之间存在1
子数组,它是[2,4]
,3
和等于s=6
的连续子数组之间存在1
子数组,它是[-1,6,1]
。请注意,子数组 [1, 2, 4, -1]
的总和也为 s
,但其长度大于 k
,因此不适用。
所以答案是3
。
下面是我在Python中的尝试。我的想法是将每个前缀和出现的索引存储在字典中。例如,如果前缀和6
出现在索引1
、3
,则字典中的条目将是六:[1,3]
。然后,在每个步骤中,我们可以检查是否遇到了目标和<code>s</code>以及子阵列的范围。
这通过了10/15的测试案例,但是超出了剩余隐藏案例的时间限制。如果有人有优化的算法,我会很感激。
import collections
def solution(arr, k, s):
res = 0
curr = 0
d = collections.defaultdict(list)
d[0].append(-1)
for i, num in enumerate(arr):
curr += num
if curr - s in d:
for idx in d[curr-s]:
if i - idx <= k:
res += 1
d[curr].append(i)
return res
我们使用计数字典来跟踪前缀和的计数。我们还将使用大小为k的滑动窗口,根据前面的索引增加前缀和的计数,并根据后面的索引递减它。在我们递减之前,我们将根据累积和的计数添加到有效子数组的计数中,该计数比我们的后面累积和多k。
def solution(arr, k, s)
num_subarrays = 0
front_cumulative_sum = 0
rear_cumulative_sum = 0
cumulative_sum_to_count = Hash.new { |h, cumsum| h[cumsum] = 0 }
0.upto(arr.size - 1 + k) do |front_index|
front_cumulative_sum += arr[front_index] if front_index <= arr.size - 1
cumulative_sum_to_count[front_cumulative_sum] += 1 if front_index <= arr.size - 1
if front_index >= k
rear_index = front_index - k
rear_cumulative_sum += arr[rear_index]
num_subarrays += cumulative_sum_to_count[s + rear_cumulative_sum]
cumulative_sum_to_count[rear_cumulative_sum] -= 1
end
end
return num_subarrays
end
> arr = [1,2,4,-1,6,1]
> k=3
> s=6
> solution(arr, k, s)
=> 3
给定一个整数数组,包含不超过两个不同值的最长子数组的长度是多少,使得非重复值的差异不超过 1? 例: 最大的子数组长度为4:[1,2,1,2]。 最大的子阵列具有长度4:[3,3,2,2]。值1和3相差1以上,因此[1,1,1,3,3]无效。
我知道一个O(n2)soln,它能以更好的方式实现吗,因为数组中元素的数量限制非常大
给出了一个长度为n的数组。求子数组元素的乘积之和。 解释 长度为3的数组A=[2,3,4]。 因为,对于以模1000000007计算的较长的子数组,乘积可以更大。 对于所有可能长度的子数组,即1,2,3,....,n,求这些和的有效方法是什么,其中n是数组的长度。
有人能为下面的问题提出一个简单的解决方案吗? 最长子数组:查找子数组中元素之和小于或等于“k”的最长连续子数组的长度。 输入为:< code>array和< code>k。 例子: 输出: 2个 解释: 子数组:{1},{2},}3},1,2},2,3},{1,2,3} {1,2} =
文件输入。txt由两行组成:第一行是整数N空格,然后是整数K(1 ≤ N、 K级≤ 250000). Second有N个空间除数的整数,其中每个整数都小于或等于K。保证从1到K的每个整数都在数组中。任务是找到包含所有整数的最小长度的子数组。并打印其开始和结束。请注意,索引从1开始。 示例: 我在最近的一次编程比赛中完成了这个任务。一切都结束了,我没有作弊。我已经使用python 3实现了它: 这个
给定一个大小为n的非递减数组a和一个整数k,如何找到数组a的一个子序列S,其元素的最大可能和,使得这个和最多为k。如果有多个这样的子序列,我们只想找到一个。 例如,让数组为{1,2,2,4},n=4,k=7。那么,答案应该是{1,2,4}。 蛮力方法大约需要O(n(2^n-1))但是有更有效的解决方案吗?