如何求最小值与子列表长度乘积之和

2024-09-28 22:10:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个n号的列表。我想将列表划分为子列表,例如子列表由连续递增的数字或连续递减的数字组成。然后取每个子列表的最小值与其长度的乘积。最后求出这个乘积的和

输入:

l = [1,2,6,4,2,3,1,8,9,7]

输出:

32

详情:

[1,2,6],[6,4,2],[2,3],[3,1],[1,8,9],[9,7]
(1*3)  +(2*3)  + (2*2)+(1*2)+(1*3)+ (7*2) = 32

迄今为止的代码:

n = 10
l = [1,2,6,4,2,3,1,8,9,7]

tot = 0
count = 0
inc=dec=False
min_val = 1001 # max value in list won't exceed 1000
for idx, e in enumerate(l):
    if idx+1<=n:
        if e > l[idx+1]:
            count+=1
            if min_val > l[idx+1]:
                min_val=l[idx+1]
            inc=True
            dec=False
        elif e < l[idx+1]:
            count+=1
            if min_val > e:
                min_val=e
            dec=True
            # if not inc
            inc=False

*注意:列表中没有两个相邻值相等

更新-1:

itemp = [1001]
dtemp = [1001]
result=0
for e in l:
    # if not itemp or not dtemp:
    #     itemp.append(e)
    #     dtemp.append(e)
    if e > itemp[-1]:
        if not dtemp:
            itemp.append(e)
        else:
            result+=(min(dtemp)*(len(dtemp)-1))
            dtemp=[1001]
            itemp.append(e)
    elif e < dtemp[-1]:
        dtemp.append(e)
        if not itemp:
            dtemp.append(e)
        else:
            result+=(min(itemp)*(len(itemp)-1))
            itemp=[1001]
            dtemp.append(e)

print(result)

这将0作为输出。有人能帮忙吗


Tags: infalse列表ifcountnotvalresult
3条回答
tot = start = m = n = 0
direc = -1
for n, x in enumerate(lis):
    if n == 0:
        m = x
    else:
        old = lis[n - 1]
        if (x > old and direc == 0) or (x < old and direc == 1):
            tot += m * (n - start)
            start = n - 1
            m = min(old, x)
            direc ^= 1
        else:
            direc = 1 if x > old else 0
            m = min(m, x)
ln = n - start + 1
if ln > 1:
    tot += m * ln
l = [1,2,6,4,2,3,1,8,9,7]
local_max= [i for i in range(1, len(l)-1) if l[i-1]<l[i]>l[i+1]]
local_min= [i for i in range(1, len(l)-1) if l[i-1]>l[i]<l[i+1]]
idx= sorted(local_max+local_min +[0,len(l)-1])
idx_pairs = zip(idx[:-1],idx[1:])
sum(min(l[i_1],l[i_2])*(i_2+1-i_1) for i_1,i_2 in idx_pairs)

您可以使用zip识别断裂位置(峰和底),以检测3个元素的每个序列之间的增加/减少值的变化。然后使用这些中断来形成子列表,并在理解中应用计算

L = [1,2,6,4,2,3,1,8,9,7]

breaks = [i+1 for i,(a,b,c) in enumerate(zip(L,L[1:],L[2:])) if (a<b)==(b>c)]
subL   = [ L[s:e+1] for s,e in zip([0]+breaks,breaks+[len(L)]) ]
result = sum(min(s)*len(s) for s in subL)

print(breaks) # [2, 4, 5, 6, 8]  indices of peaks and bottoms
              #                  [1,2,6,4,2,3,1,8,9,7]
              #                       ^   ^ ^ ^   ^
              #                   0 1 2 3 4 5 6 7 8 9 
 
print(subL)   # [ [1, 2, 6], [6, 4, 2], [2, 3], [3, 1], [1, 8, 9], [9, 7]]
              #   0..2+1     2..4+1     4..5+1  5..6+1  6..8+1     8..len(L)
              #   |  |       |  |       |  |    |  |    |  |       |  |
              #  [0] |   +  [2, |       4, |    5, |    6, |       8] |      
              #     [2,         4,         5,      6,      8]      + [len(L)]

print(result) # 32

相关问题 更多 >