import sys
trig = []
base, area = input().strip().split(' ')
base, area = [int(base), int(area)]
for i in range(1,area+1):
form = abs(((base*i)/2)-area)
trig.append(form)
for i in range(1,area+1):
form = abs(((base*i)/2)-area)
if form == min(trig):
print(i)
我试图从第一个for
循环中找到最小值,但我想避免使用列表,因为我希望程序运行得更快。如何在不使用列表的情况下执行此操作?
答案 0 :(得分:0)
我会继续尝试根据您的代码猜测您想要的内容 - 这实际上只保留一个变量并检查每个循环的最小值(并根据需要进行相应更新):
base, area = input().strip().split()
base, area = int(base), int(area)
min_pos = 1
min_trig = abs(base / 2 - area) # calculate the first immediately
for i in range(2, area + 1): # loop from the second...
form = abs((base * i) / 2 - area)
if form < min_trig:
min_pos = i
min_trig = form
print(min_pos)
<强>更新强>
如评论中所述,上述内容仅针对单个最小值找到索引,因此只有在有一个最小值时才会正确。如果您需要最低限度列表,您可以执行以下操作:
base, area = input().strip().split()
base, area = int(base), int(area)
min_pos = [1] # initialize the first index as a minimum immediately
min_trig = abs(base / 2 - area) # calculate the first trig as a minimum immediately
for i in range(2, area + 1): # loop from the second...
trig = abs((base * i) / 2 - area)
if trig == min_trig:
min_pos.append(i)
elif trig < min_trig:
min_pos = [i]
min_trig = trig
print(min_pos) # prints you a list of all minimum positions
这样您就不必将所有内容存储在单独的列表中,也不需要进行双循环。纯O(N)溶液。
答案 1 :(得分:-1)
根据您的代码现在所做的事情,我创建了您的细分市场的另一个版本,基本上做同样的事情。我用输入字符串"5 16"
测试了它,它似乎正在工作。我使用的代码如下:
import sys
trig = []
base, area = input().strip().split(' ')
base, area = [int(base), int(area)]
minTrig = (base * area) / 2 # set an upperbound on minTrig so that the max value in the trig array will be less than this value.
for i in range(1,area+1):
form = abs(((base * i) / 2) - area)
trig.append(form)
minTrig = min(minTrig, form)
indices = [i + 1 for i, x in enumerate(trig) if x == minTrig]
print(indices)
这使用列表推导来创建一个包含最小数量的所有索引的新数组。
可以找到用于查找所有最小值元素的代码here。
当我使用"5 16"
测试我的代码时,输出为[6, 7]
。