先附个链接👉非零段划分
题目
描述
样例
-
样例1:
输入11 3 1 2 0 0 2 0 4 5 0 2
输出
5
解释:
-
样例2
输入14 5 1 20 10 10 10 10 15 10 20 1 5 10 15
输出
4
子任务
题解
暴力求解(70分)
一开始纯纯的暴力求解。。。70分过了第一个任务,剩下就是超时了
N = int(input())
A = list(map(int,input().split()))
def count_num(lst,n):
flag = 1
num = 0
for i,v in enumerate(lst):
if v>=n and (flag == 0 or i==0):
num+=1
flag=1
elif v<n and flag == 1:
flag = 0
return num
max = max(A)
num = 0
for k in A:
tmp = count_num(A,k)
num = tmp if tmp>num else num
print(num)
可以看出最大的问题就是两个循环的嵌套,出现了n^2的复杂度
现在的主要方案就是要将两个循环降为一个
差分数组(100分)
题目要求求出数值“峰”数量最多的海平面,“峰”和“谷”的计算需要看相邻两个数之间的关系
题目特征:相邻两个数的运算->差分数组
峰和谷中间的任何一个数都可以将峰漏出来,所以以这两个数之间的任何一个数作为海平面,其所漏出的峰的数量是一致的
但是这样一个数据一个数据的计算记录效率太低(如上),那么就考虑利用两个数据间关系化简->差分数组(中间有太多数据重复,计算当前数据只需要更改当前数与上一个数的差值,最后通过求和求得当前数据)
参考文章
👉前缀和以及差分
👉前缀和算法
N = int(input())
A = list(map(int,input().split()))
A.append(0)
A.insert(0,0)
Max = max(A)
dif = [0 for i in range(Max+1)]
for i in range(1,len(A)):
if A[i]>A[i-1]:
dif[A[i-1]]+=1
dif[A[i]]-=1
t,ans = 0,0
for i in dif:
t+=i
ans = max(ans,t)
print(ans)
不得不说差分还挺重要的,不咋做算法也能碰到他好几次……