版权声明:本文为博主原创文章,未经博主允许不得转载。 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)