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。

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的遍历时,总会忘了写步长参数,特此记录,以示提醒。 

你可能感兴趣的:(CSP,python,csp,数组)