假设我们需要转换一个整数数组,然后计算总和。
转换如下:
对于数组中的每个整数,减去等于或小于其值的第一个后续整数。
例如,数组:
[5, 1, 1, 2, 4, 2]
成为
6 > 1 so 6 - 1 = 5
nothing <= to 1 so 1 remains 1
3 > 2 so 3 - 2 = 1
4 > 2 so 4 - 2 = 2
6 > 2 so 6 - 2 = 4
nothing <= to 2 so 2 remains 2
so we sum [5, 1, 1, 2, 4, 2] = 15
因为
prices = [6, 1, 3, 4, 6, 2]
results = []
counter = 0
num_prices = len(prices)
for each_item in prices:
flag = True
counter += 1
for each_num in range(counter, num_prices):
if each_item >= prices[each_num] and flag == True:
cost = each_item - prices[each_num]
results.append(cost)
flag = False
if flag == True:
results.append(each_item)
print(sum(results))
我已经在下面给出了答案,但是显然有一种更好的方法。我的答案是二次时间复杂度(嵌套循环),我不知道如何优化它。
break
有人能找出比二次时间复杂度更快的答案吗?我很确定这只能使用1 for循环来完成,但是我不知道要使用的数据结构。
编辑:
我可能会误会...我只是意识到我可以在flag = False
之后添加break
语句,这样可以避免一些不必要的迭代。我在一个测验中回答了这个问题,一半的测试用例说有一个更优化的方法。他们可能一直在引用 public List <Appliance> Appliances { get; set; }
public Appliance NewAppliance { get; set; }
public string DepositTotalBalance { get; set; }
public string DepositGiven { get; set; }
public string DepositReturned { get; set; }
语句,所以也许没有比使用嵌套的for循环更快的方法
答案 0 :(得分:1)
您可以使用堆栈(使用Python列表实现)。该算法是线性的,因为每个元素最多可进行两次比较(一次与下一个元素进行比较,一次与下一个小于或等于它的数字进行比较)。
def adjusted_total(prices):
stack = []
total_substract = i = 0
n = len(prices)
while i < n:
if not stack or stack[-1] < prices[i]:
stack.append(prices[i])
i += 1
else:
stack.pop()
total_substract += prices[i]
return sum(prices) - total_substract
print(adjusted_total([6, 1, 3, 4, 6, 2]))
输出:
15
答案 1 :(得分:1)
一种使用列表的简单方法,尽管仍然是二次的。
p = [6, 1, 3, 4, 6, 2]
out= []
for i,val in zip(range(len(p)),p):
try:
out.append(val - p[[x <= val for x in p[i+1:]].index(True)+(i+1)])
except:
out.append(val)
sum(out) # equals 15
numpy方法-老实说没有编程背景,所以我不确定它是否是线性的(取决于条件屏蔽在后台的工作方式),但仍然很有趣
p = np.array([6, 1, 3, 4, 6, 2])
out = np.array([])
for i,val in zip(range(len(p)),p):
pp = p[i+1:]
try:
new = val - pp[pp<=val][0]
out = np.append(out,new)
except:
out = np.append(out,p[i])
out.sum() #equals 15