求数组所有区间最大值减去最小值之差的和(贝壳笔试题)Python

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gsch_12/article/details/82014389

求数组所有区间最大值减去最小值之差的和(贝壳笔试题)
思路1:
暴力O(N^3),

def jicha(list1,n):
    sum1=0
    temp_dic={}
    for i in range(n):
        for j in range(n):
            if(i<j):
                sij = str(i) + str(j)
                if(sij not in temp_dic):
                    temp_dic[sij]=(max(list1[i:j+1])-min(list1[i:j+1]))
    for i in temp_dic:
        sum1 = sum1 + temp_dic[i]
    return sum1
if __name__ == "__main__":
    N = int(input())
    l=input().split(' ')
    list1=list(map(int,l))
    print(jicha(list1,N))

动态规划O(n^2)

n = int(input())
li = list(map(int,input().split(' ')))
k=[0 for i in range(n)]
#构建[[n个0],[],[]..n个[]],nxn的list分别存储区间的最大值和最小值,以下是初始化
maxm = [[0 for i in range(n)] for i in range(n)]
minm = [[0 for i in range(n)] for i in range(n)]
'''遍历所有区间,o(n^2),利用动态规划,每增加1个值,
新序列的最大值就和上一个序列最大值相比,
这个比较是O(1),所以最终求所有序列最大值和最小值的复杂度是O(N^2)。
求极差和的时候,就继续O(n^2)的遍历就好,复杂度O(n^2)。
总共就是O(n^2)的复杂度
'''
for i in range(n):
    for j in range(i,n):
        if i == j:
            maxm[i][j] = li[i]
        else:
            maxm[i][j] = max(maxm[i][j-1],li[j])
for i in range(n):
    for j in range(i,n):
        if i == j:
            minm[i][j] = li[i]
        else:
            minm[i][j] = min(minm[i][j-1], li[j])
su =0
#求极差和
for i in range(n):
    for j in range(i,n):
        su = su + maxm[i][j] - minm[i][j]
print(su)

猜你喜欢

转载自blog.csdn.net/gsch_12/article/details/82014389
今日推荐