MCPcopy
hub / github.com/HuberTRoy/leetCode / maxALEminB

Function maxALEminB

DP/MaxASubarrayLessThanMinBSubarray.py:83–161  ·  view source on GitHub ↗

思路与前一致,前一版的主要瓶颈在于有太多重复的数据,若可以将这些重复的数据统计到一起,可以极大的减少对比次数。 [[3], [2], [1]] 现在变为 [[(3, 1)], [(2, 1)], [(1, 1)]] 即缩小重复的数据的检测结果。 例: [5, 6, 5, 3, 1, 8, 1, 1, 3, 5], [[5], [6, 6], [5, 6, 6], [3, 5, 6, 6], [1, 3, 5, 6, 6], [8, 8, 8, 8, 8, 8],

(a, b)

Source from the content-addressed store, hash-verified

81#
82
83def maxALEminB(a, b):
84 """
85 思路与前一致,前一版的主要瓶颈在于有太多重复的数据,若可以将这些重复的数据统计到一起,可以极大的减少对比次数。
86 [[3], [2], [1]]
87 现在变为
88 [[(3, 1)], [(2, 1)], [(1, 1)]]
89 即缩小重复的数据的检测结果。
90 例:
91 [5, 6, 5, 3, 1, 8, 1, 1, 3, 5],
92 [[5], [6, 6], [5, 6, 6], [3, 5, 6, 6], [1, 3, 5, 6, 6], [8, 8, 8, 8, 8, 8], ...]
93 dp1的检测为,若当前的值大于之前中的值的某一个[-1:0],从前到后是按升序排列的。
94 就从最初出现的那个地方截断,之前的值全部替换为此最大值,若没有一个大于的,则直接将之前的追加到当前的结果中。
95 dp2的检测只将 大于 变为 小于。
96
97 关于对比:
98 每一组的个数可能不同,但总量是一致的。
99 两组同时取出自己的一个数据,若b > a则结果中加上 b 和 a 中出现的次数较少的一个。并减去,开始下一轮,b或a中任意一个的出现次数为0时,
100 取出相应的本组的下一个数据,同时为0时开始下一轮循环。
101 """
102 dp1 = [[[i, 1]] for i in a]
103 dp2 = [[[i, 1]] for i in b]
104
105 # [
106 # [
107 # [i, 1]
108 # ]
109 # ]
110 for i in range(1, len(dp1)):
111 value = dp1[i][0]
112 j = dp1[i-1]
113
114 # 二次优化后提高了 0.2 s.
115 if j[0][0] > value[0]:
116 dp1[i].extend(j)
117 continue
118
119 for x in range(len(j)-1, -1, -1):
120 x2 = j[x]
121 if x2[0] <= value[0]:
122 dp1[i] = [[value[0], sum([t[1] for t in j[:x+1]])+1]] + j[x+1:]
123 break
124
125 for i in range(1, len(dp2)):
126 value = dp2[i][0]
127 j = dp2[i-1]
128 if j[0][0] <= value[0]:
129 dp2[i].extend(j)
130 continue
131
132 for x in range(len(j)-1, -1, -1):
133 x2 = j[x]
134 if x2[0] >= value[0]:
135 dp2[i] = [[value[0], sum([t[1] for t in j[:x+1]])+1]] + j[x+1:]
136 break
137
138 result = 0
139 for i, j in zip(dp1, dp2):
140 valueA = 0

Calls 1

popMethod · 0.45

Tested by

no test coverage detected