python - 计算子数组的数量,使得子数组中的每个元素至少出现两次
问题描述
我遇到了一个问题,似乎无法提出有效的解决方案。问题如下:
给定一个数组 A,计算连续连续子数组的数量,使得子数组中的每个元素至少出现两次。
例如,对于:
A = [0,0,0]
答案应该是 3 因为我们有
A[0..1] = [0,0]
A[1..2] = [0,0]
A[0..3] = [0,0,0]
另一个例子:
A=[1,2,1,2,3]
答案应该是 1,因为我们有:
A[0..3] = [1,2,1,2]
我似乎无法为这个算法想出一个有效的解决方案。我有一个算法可以检查每个可能的子数组(O(n ^ 2)),但我需要更好的东西。这是我天真的解决方案:
def duplicatesOnSegment(arr):
total = 0
for i in range(0,len(arr)):
unique = 0
test = {}
for j in range(i,len(arr)):
k = arr[j]
if k not in test:
test[k] = 1
else:
test[k] += 1
if test[k] == 1:
unique += 1
elif test[k] == 2:
unique -= 1
if unique == 0:
total += 1
return total
解决方案
if k not in test
当您在嵌套循环中使用时,您的程序在最坏的情况下大于 O(n^2) 。这in
在最坏的情况下是 O(n),导致整体最坏的情况为 O(n^3)。我有这个,最坏的 O(n^2) 解决方案,它collections.defaultdict
用作散列以使其更快。
from collections import defaultdict
def func(A):
result = 0
for i in range(0,len(A)):
counter = 0
hash = defaultdict (int)
for j in range (i, len(A)):
hash[A[j]] += 1
if hash[A[j]] == 2:
counter += 1
if counter != 0 and counter == len(hash):
result += 1
return result
推荐阅读
- flutter - 为什么我要删除 build/ 目录?
- sitecore - Sitecore 9.0.2 访问 URL 时的 Windows 身份验证
- c# - 检查文件或文件夹是否“始终可用脱机”?
- mysql - 如何在 Spring Boot 应用程序中通过 ssh 隧道连接到远程 mysql
- nlp - 如何评估使用 Rouge 指标的黄金摘要生成的自动摘要?
- php - 纯 PHP 中的 Laravel DB 表模型实现
- amazon-web-services - 尝试通过 AWS 应用程序负载均衡器和 Cognito 进行身份验证时出现 500 错误
- java - 解析后在 JVM 中存储的解析引用(即针对符号引用的直接内存地址)在哪里?
- spring - 在模拟对象上调用公共非静态函数时出现 MissingMethodInvocationException
- python - Tkinter 窗口不会在按钮按下时破坏