转换整数数组并计算总和

时间:2019-09-05 23:50:00

标签: python time-complexity

假设我们需要转换一个整数数组,然后计算总和。

转换如下:

对于数组中的每个整数,减去等于或小于其值的第一个后续整数。

例如,数组:

[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循环更快的方法

2 个答案:

答案 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