classSolution: defmaxArea(self, height: List[int]) -> int: # 时间复杂度 n,相向遍历一次,空间复杂度 1,额外空间与变量大小无关 l = 0 r = len(height)-1 ans = 0 while l < r: cur = min(height[l], height[r]) * (r-l) if cur > ans: # print(l, r, cur, ans) ans = cur if height[l] > height[r]: r -= 1 else: l += 1 return ans
classSolution: deftrap(self, height: List[int]) -> int: # 时间复杂度 n,相向遍历一次,空间复杂度 1,额外变量固定 n = len(height) l = 0 r = n-1 ans = 0 pre_max = 0 suf_max = 0 while l < r: pre_max = max(pre_max, height[l]) suf_max = max(suf_max, height[r])
if height[l] < height[r]: ans += pre_max-height[l] l += 1 else: ans += suf_max-height[r] r -= 1 return ans
# 时间复杂度 n,空间复杂度 n,前后缀都存 n = len(height) # 前后缀最大值 front = [0] * n back = [0] * n
front[0] = height[0] for i inrange(1, n): if height[i] > front[i-1]: front[i] = height[i] else: front[i] = front[i-1] back[-1] = height[-1] for i inrange(n-2, -1, -1): if height[i] > back[i+1]: back[i] = height[i] else: back[i] = back[i+1] ans = 0 for i inrange(1, n-1): ans += max(min(front[i-1], back[i+1]) - height[i], 0) return ans
classSolution: defisPalindrome(self, s: str) -> bool: # 时间复杂度 n,空间复杂度 1 n = len(s) s = s.lower() # print(s) l = 0 r = n-1 vocab = [chr(i) for i inrange(97, 123)] + [chr(i) for i inrange(48, 58)] while l < r: while l < r and s[l] notin vocab: l += 1 while l < r and s[r] notin vocab: r -= 1 if s[l] != s[r]: returnFalse else: l += 1 r -= 1
while l < r: if cur_a >= plants[l]: cur_a -= plants[l] else: ans += 1 cur_a = capacityA - plants[l] l += 1
if cur_b >= plants[r]: cur_b -= plants[r] else: ans += 1 cur_b = capacityB - plants[r] r -= 1 if l == r: # 这里是两边各来到了相同的最后一个 if cur_b > cur_a: if cur_b < plants[l]: ans += 1 else: if cur_a < plants[l]: ans += 1