如何从 for 循环中找到最小值?
How can I find the minimum value from a for loop?
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
循环中找到最小值,但我想避免使用列表,因为我希望程序 运行 更快。如何在不使用列表的情况下执行此操作?
我会继续尝试根据你的代码猜测你想要什么——这实际上只保留一个变量并检查每个循环的最小值(并根据需要进行相应更新):
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) 溶液。
根据您的代码现在执行的操作,我创建了您的段的另一个版本,它基本上执行相同的操作。我用输入字符串 "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]
。
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
循环中找到最小值,但我想避免使用列表,因为我希望程序 运行 更快。如何在不使用列表的情况下执行此操作?
我会继续尝试根据你的代码猜测你想要什么——这实际上只保留一个变量并检查每个循环的最小值(并根据需要进行相应更新):
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) 溶液。
根据您的代码现在执行的操作,我创建了您的段的另一个版本,它基本上执行相同的操作。我用输入字符串 "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]
。