python - 考虑一个由整数 A=[a1,a2,a3......an] 组成的数组 n。查找并打印满足 ai*aj <= max(ai,ai+1,.....aj) 其中 i < j 的对的总数
问题描述
谁能帮我解决上述问题。我们必须在数组 (a1,a2),(a1,a3),(a1,a4).... 中找到元素的组合,然后选择满足条件 (ai*aj) <= max 的那些组合(A) 其中 A 是数组并返回可能的组合数。
示例:输入数组 A = [1,1,2,4,2] 并返回 8,因为组合为:(1,1),(1,2),(1,4),(1,2), (1,2),(1,4),(1,2),(2,2)。
使用嵌套的 for 循环很容易解决这个问题,但这会非常耗时。(O(n^2))。
朴素算法:
array = [1,1,2,4,2]
result = []
for i in range(len(array)):
for j in range(len(array)):
if array[i] * array[j] <= max(array):
if (array[j],array[i]) not in result:
result.append((array[i],array[j]))
print(len(result))
当我们遇到此类问题时应该采取什么方法?
解决方案
使用嵌套的 for 循环很容易解决这个问题,但这会非常耗时。(O(n^2))。
因为where i < j
我们可以把它减半:
for i in range(len(array)):
for j in range(i+1, len(array)):
...
现在让我们摆脱这部分if (array[j],array[i]) not in result:
,因为它不能反映您的结果:(1,1),(1,2),(1,4),(1,2),(1,2),(1,4),(1,2),(2,2)
这里有骗子。
我们可以摆脱的下一个昂贵的步骤max(array)
不仅是错误的(max(ai,ai+1,…aj)
转换为max(array[i:j])
),而且必须在每次迭代中迭代整个数组部分。由于 Array 没有改变,唯一可能改变这个最大值的是array[j]
你正在处理的新值。
让我们将其存储在一个变量中:
array = [1,1,2,4,2]
result = []
for i in range(len(array)):
maxValue = array[i]
for j in range(i+1, len(array)):
if array[j] > maxValue:
maxValue = array[j]
if array[i] * array[j] <= maxValue:
result.append((array[i], array[j]))
print(len(result))
仍然是一个幼稚的算法,但我们已经做出了一些改进。
我们可以做的另一件事是不仅存储maxValue
a ,还存储 a pivot = maxValue / array[i]
,因此通过简单的比较来替换乘法if array[j] <= pivot:
。这样做是在假设乘法比 the 更频繁地调用的情况下maxValue
,因此会更频繁地调用pivot
更改。
但是由于我在 python 方面不是很有经验,我不确定这是否会对 python 产生任何影响,或者我是否正在为此进行毫无意义的微优化。
推荐阅读
- r - 如果数字匹配,则使用正则表达式捕获整个子字符串
- java - 在温度类中找不到主方法。温度,请将主方法定义为:public static void main(String[] args)
- php - 在邮件php中发送多个附件
- vuejs2 - 我想使用 Vue.js 和 Vuetify 创建动态字段
- java - Java - 合并重复键并从地图中删除重复值
- sql - SQL 开发人员建议“缺少右括号”。但我找不到哪里错了
- linux - 从 shell 脚本替换文本文件中的 NUL
- xaml - UWP 以编程方式更改 gridview 元素大小
- nuget - 如何使用 Nuget Gallery 私下发布 nuget 包
- python - 基本线性预测示例