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