CSP202109-2 非零段划分 学习笔记 python

1.索引数组(空间换时间)

数组L中有n个数,数字的范围大小为m,对于每个数字,遍历数组找到该数字,并且进行处理。对于该任务,显然时间复杂度是O(mn),但若提前遍历一遍数组,把每个数字i对应的下标进行储存,即数组idx[i]=[L中所有i所对应的下标],则处理相同任务时间复杂度变为O(n+m)。

2 .一维岛屿情况

海面为0,岛屿为非零段,输入数组nums中的值代表当前下标位置的海拔高度。海平面从max(L)下降至1(海平面高度记为level),在海平面下降过程中,i处多了一个岛屿(非零段)当且仅当此时海平面高度<=i处海拔高度且[i-1],[i+1]处都为水(海拔小于海平面),i处减少了一个岛屿当且仅当此时此时海平面高度<=i处海拔高度且[i-1],[i+1]处都已经为岛屿。记数组island代表每个位置的目前状况(水或陆地),即island[i]=0当且仅当nums[i]<level,island[i]=1当前仅当nums[i]>=level。

3.python100分程序代码

n = int(input())
# 数组前后补零
A = [0]+list(map(int, input().split()))+[0]
idx_dic = {}
maxnum = 0
for id, num in enumerate(A):
    # num是0不用记录
    if not num:
        continue
    maxnum = max(maxnum, num)
    if idx_dic.get(num) is None:
        idx_dic[num] = [id]
    else:
        idx_dic[num].append(id)

cnt, ans = 0, 0
island = [0]*(n+2)
for level in range(maxnum, 0, -1):
    if idx_dic.get(level) is None:
        continue
    for idx in idx_dic[level]:
        # 如果前后是陆地
        if island[idx-1] and island[idx+1]:
            cnt -= 1
        # 如果前后是水
        elif not island[idx-1] and not island[idx+1]:
            cnt += 1
        island[idx] = 1
    ans = max(ans, cnt)
print(ans)

4.提醒

作者用range写步长为-1的遍历时,总会忘了写步长参数,特此记录,以示提醒。 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值