if x - 1 < 0: returnFalse if x + 1 >= row: returnFalse if y - 1 < 0: returnFalse if y + 1 >= col: returnFalse
res = True if visited[x-1][y] == 0: res = res and _rainDrop(x - 1, y) if visited[x+1][y] == 0: res = res and _rainDrop(x + 1, y) if visited[x][y-1] == 0: res = res and _rainDrop(x, y - 1) if visited[x][y+1] == 0: res = res and _rainDrop(x, y + 1)
defdecodeString(self, s: str) -> str: res = '' count = 0 p = '' state = 'print' for c in s: if state == 'print'andord('a') <= ord(c) <= ord('z'): res += c eliford('1') <= ord(c) <= ord('9'): count = count * 10 + int(c) elif c == '[': state = 'start' elif c == ']': res += p * count count, p = 0, '' state = 'print' elif state == 'start'andord('a') <= ord(c) <= ord('z'): p += c return res
defsearchMatrix(self, matrix: List[List[int]], target: int) -> bool: m = len(matrix) if m == 0: returnFalse n = len(matrix[0]) if n == 0: returnFalse
x, y = m - 1, 0 while matrix[x][y] != target: if matrix[x][y] > target: if x - 1 >= 0: x -= 1 else: returnFalse else: if y + 1 < n: y += 1 else: returnFalse returnTrue
注意看第 11 行,假设我们已经遇到了 n 个数字,并且我们按照 1/n 的概率,选中了一个下标 a 的时候,这时候,又来了一个数字,第 n + 1 个,其下标是 b,那么,这时候我们到底是返回 a 还是返回 b 呢?注意,我们最终返回的下标,其出现的概率是 1/(n+1),我们已经知道 a 出现的概率是 1/n,这时候怎么处理 b 呢?
defquickAdd(q: int) -> int: res, add = 0, divisor while q > 0: if q & 1 == 1: res += add add += add q >>= 1 return res
left, right = 0, 1 << 31 maxInt = right - 1 while left <= right: mid = (left + right) >> 1 if quickAdd(mid) > dividend: # 注意:最终右边界会停在 <= dividend 的地方 right = mid - 1# 我们的答案正是右边界 else: left = mid + 1 res = -right if neg else right return res if res < maxInt else maxInt