classSolution: defvalidPartition(self, nums: List[int]) -> bool: #动态规划,注意子数组为连续子数组,所以有效划分必须连在一起 n = len(nums) f = [True] + [False] * n #f(i+1)表示能有效划分0-i for i, x inenumerate(nums): if i > 0and f[i-1] and x == nums[i-1] or \ i > 1and f[i-2] and (x == nums[i-1] == nums[i-2] or x == nums[i-1]+1 == nums[i-2]+2): f[i+1] = True return f[n]
给你一个二维整数数组 edges ,长度为 n - 1 ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restricted 表示 受限 节点。
在不访问受限节点的前提下,返回你可以从节点 0 到达的 最多 节点数目*。*
注意,节点 0不 会标记为受限节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution: defreachableNodes(self, n: int, edges: List[List[int]], restricted: List[int]) -> int: restricted = set(restricted) road = [[] for _ inrange(n)] for x,y in edges: if x notin restricted and y notin restricted: #如果路之间不含无效节点,则连通 road[x].append(y) road[y].append(x) defdfs(x: int, rep:int) -> int: #dfs遍历 res = 1 for y in road[x]: if y != rep: #避免x,y与y,x重复递归 res += dfs(y,x) return res return dfs(0,-1)
3号_225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
给你一个下标从 0 开始的字符串 word ,长度为 n ,由从 0 到 9 的数字组成。另给你一个正整数 m 。
word 的 可整除数组div 是一个长度为 n 的整数数组,并满足:
如果 word[0,...,i] 所表示的 数值 能被 m 整除,div[i] = 1
否则,div[i] = 0
返回 word 的可整除数组。
1 2 3 4 5 6 7 8 9
classSolution: defdivisibilityArray(self, word: str, m: int) -> List[int]: res = [] rem = 0 for i inrange(len(word)): rem = (rem * 10 + int(word[i])) % m #word[:i]*10+word[i]=word[:i+1]=(nm+res)*10+word[i],n为整数 if rem: res.append(0) else: res.append(1) return res
classSolution: defkSum(self, nums: List[int], k: int) -> int: #求出最大值s,并且把所有负数转为正数,这样统一只需要做减法即可 sum = 0 for i, x inenumerate(nums): if x >= 0: sum += x else: nums[i] = -x nums.sort()
#以累加和来排列子序列,排到第k个终止 stack = [(0,0)] #空子序列,一个用来装子序列和,一个装下标 for _ inrange(k-1): #已经有一个(0,0),所以只需要循环k-1次 s, i = heappop(stack) if i < len(nums): #子序列下标不超过原序列下标 # 在子序列的末尾添加 nums[i] heappush(stack, (s + nums[i] , i+1) ) # 下一个添加/替换的元素下标为 i+1 if i: # 替换子序列的末尾元素为 nums[i] heappush(stack, (s + nums[i] - nums[i-1], i+1) ) returnsum - stack[0][0]
#暴力枚举,一个高宽为ij的木板,有三种情况,横切竖切和自身 classSolution: defsellingWood(self, m: int, n: int, prices: List[List[int]]) -> int: f = [[0]* (n+1) for _ inrange(m+1)] for w, h, p in prices: f[w][h] = p for i inrange(m+1): for j inrange(n+1): f[i][j] = max(f[i][j], max((f[i][k]+f[i][j-k] for k inrange(1, j // 2 + 1)), default = 0), #横向切割 max((f[k][j]+f[i-k][j] for k inrange(1, i// 2 + 1)), default = 0)) #纵向切割 return f[m][n]
#朴素dfs遍历,每个遍历返回长度,最后比较长度 classSolution: defmaxMoves(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) f = [[0] * n for _ inrange(m)] #哈希表存储对应dfs值,避免重复遍历 defdfs(i,j): #dfs遍历 res1, res2, res3 = 0, 0, 0#用来储存返回值,避免超出索引 if j >= n-1: return0 if i > 0and grid[i][j] < grid[i-1][j+1]: ifnot f[i-1][j+1]: #如果为0,则递归后续 f[i-1][j+1] = dfs(i-1,j+1) res1 = 1 + f[i-1][j+1] #如果f[i-1][j+1]有值,直接使用 if grid[i][j] < grid[i][j+1]: ifnot f[i][j+1]: f[i][j+1] = dfs(i,j+1) res2 = 1 + f[i][j+1] if i < m-1and grid[i][j] < grid[i+1][j+1]: ifnot f[i+1][j+1]: f[i+1][j+1] = dfs(i+1,j+1) res3 = 1 + f[i+1][j+1] returnmax(res1, res2, res3) lst = [] for i inrange(m): lst.append(dfs(i,0)) returnmax(lst)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#dfs遍历,直接输出最长长度 classSolution: defmaxMoves(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) ans = 0 defdfs(i: int, j: int) -> None: nonlocal ans ans = max(ans, j) #只需要确定ans的最大值,函数不需要返回任何值 if ans == n - 1: # ans 已达到最大值 return for k in i - 1, i, i + 1: # 向右上/右/右下走一步 if0 <= k < m and grid[k][j + 1] > grid[i][j]: dfs(k, j + 1) grid[i][j] = 0#使得后续遍历不再走该节点 for i inrange(m): dfs(i, 0) # 从第一列的任一单元格出发 return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#BFS遍历 #一开始把所有 (i,0)(i,0)(i,0) 都加入一个列表。每一轮循环,遍历列表中的坐标,把右边这一列的能到达的格子坐标加入一个新列表。注意只有之前没入队的格子才能入队,,我们可以把要入队的格子值变为其相反数,从而判断哪些格子在队列中。此外,一个数一旦变成负数就不会比当前格子值大了,这可以保证一个格子值只会被标记(改成相反数)一次。 classSolution: defmaxMoves(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) for row in grid: row[0] *= -1# 入队标记 for j inrange(n - 1): for i, row inenumerate(grid): if row[j] > 0: # 不在队列中 continue for k in i - 1, i, i + 1: if0 <= k < m and grid[k][j + 1] > -row[j]: grid[k][j + 1] *= -1# 入队标记 ifall(row[j + 1] > 0for row in grid): # 无法再往右走了 return j return n - 1
17号_310. 最小高度树
给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条无向边。
可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为 最小高度树 。
classSolution: deffindMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]: if n == 1: return [0]
d = [[] for _ inrange(n)] for x, y in edges: d[x].append(y) d[y].append(x) father = [0] * n
defbfs(start): vis = [False] * n vis[start] = True qe = deque([start]) while qe: x = qe.popleft() for y in d[x]: ifnot vis[y]: #避免重复遍历 vis[y] = True father[y] = x #记录父节点 qe.append(y) return x #先找离起始点最远的点x,再找离x最远的点y,xy即为最远距离 x = bfs(0) y = bfs(x)
path = [] father[x] = -1 while y != -1: path.append(y) y = father[y] m = len(path) return [path[m//2]] if m % 2else [path[m//2 - 1], path[m//2]]
一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 。一个 好 子数组的两个端点下标需要满足 i <= k <= j 。
请你返回 好 子数组的最大可能 分数 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#双指针 classSolution: defmaximumScore(self, nums: List[int], k: int) -> int: i = j = k n = len(nums) s = h = nums[k] for _ inrange(n-1): #必须遍历所有可能,而不是加终止条件 if j == n-1or (i and nums[i-1] >= nums[j+1]): #and的优先级比or高,实际上可以不加括号 h = min(h,nums[i-1]) i -= 1 else: h = min(h,nums[j+1]) j += 1 print(i,j,h,s) s = max(s, h*(j-i+1)) return s
#动态规划 classSolution: defcoinChange(self, coins: List[int], amount: int) -> int: dp = [float('inf')] * (amount+1) dp[0] = 0 for i inrange(1,amount+1): #先amount再coins是排列,先coins再amount是组合 for coin in coins: if coin <= i: dp[i] = min(dp[i], dp[i-coin]+1) return dp[amount] if dp[amount] < float('inf') else -1
1 2 3 4 5 6 7 8 9 10
#递归 classSolution: defcoinChange(self, coins: List[int], amount: int) -> int: @cache #缓存器 defdfs(i,a): if i < 0: return0if a == 0else inf if a < coins[i]: return dfs(i-1,a) returnmin(dfs(i-1,a), dfs(i,a-coins[i])+1) ans = dfs(len(coins)-1, amount) return ans if ans < inf else -1
defshortestPath(self, node1: int, node2: int) -> int: done = [False] * self.n dist = [inf] * self.n dist[node1] = 0 whileTrue: x = -1#重置x for i, do inenumerate(done): ifnot do and (x<0or dist[i] < dist[x]): x = i if x == node2: return dist[node2] if dist[node2] < inf else -1 for y, d inenumerate(self.f[x]): new_dist = dist[x] + d if new_dist < dist[y]: dist[y] = new_dist done[x] = True
#时间O(N2),空间O(1) classSolution: defminimumSum(self, nums: List[int]) -> int: res = float('inf') for i inrange(1,len(nums)-1): m, l, r =nums[i], min(nums[:i]), min(nums[i+1:]) if l<m and r<m: res = min(res, l+r+m) return res if res < float('inf') else -1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#时间O(N),空间O(N) classSolution: defminimumSum(self, nums: List[int]) -> int: n = len(nums) suf = [0] * n suf[-1] = nums[-1] # 后缀最小值 for i inrange(n - 2, 1, -1): suf[i] = min(suf[i + 1], nums[i])
ans = inf pre = nums[0] # 前缀最小值 for j inrange(1, n - 1): if pre < nums[j] > suf[j + 1]: # 山形 ans = min(ans, pre + nums[j] + suf[j + 1]) # 更新答案 pre = min(pre, nums[j]) return ans if ans < inf else -1
classSolution: defminimumAddedCoins(self, coins: List[int], target: int) -> int: coins.sort() s, i, res = 1, 0, 0 while s <= target: #贪心,考虑每个coin[i]所能覆盖的范围 if i < len(coins) and coins[i] <= s: s += coins[i] i += 1 else: s *= 2 res += 1 return res
#暴力 classSolution: deffinalString(self, s: str) -> str: ans = [] for item in s: if item == 'i': ans = ans[::-1] else: ans.append(item) return''.join(ans)
1 2 3 4 5 6 7 8 9 10 11 12 13
#双向队列 classSolution: deffinalString(self, s: str) -> str: qe = deque() tail = True#判断从尾部加元素还是从头部加 for c in s: if c == 'i': tail = not tail #修改方向 elif tail: qe.append(c) else: qe.appendleft(c) return''.join(qe if tail elsereversed(qe))
给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val == 0 。
答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的真二叉树列表**。**
真二叉树 是一类二叉树,树中每个节点恰好有 0 或 2 个子节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#分治,递归 classSolution: @cache defallPossibleFBT(self, n: int) -> List[Optional[TreeNode]]: res = [] if n % 2 == 0: return res if n == 1: res.append(TreeNode(0)) return res for k inrange(1,n,2): left = self.allPossibleFBT(k) right = self.allPossibleFBT(n-1-k) for l in left: for r in right: node = TreeNode(0,l,r) res.append(node) return res
1 2 3 4 5 6 7 8 9 10 11 12 13
#dp classSolution: defallPossibleFBT(self, n: int) -> List[Optional[TreeNode]]: if n % 2 == 0: return [] l = n//2 + 1 dp = [[] for _ inrange(l)] dp[0] = [TreeNode(0)] for i inrange(1,l): for j inrange(i): for l in dp[j]: for r in dp[i-j-1]: dp[i].append(TreeNode(0,l,r)) return dp[-1]
请你返回一个数组 answer,其中 answer[i]是第 i 个节点的所有 祖先 ,这些祖先节点 升序 排序。
如果 u 通过一系列边,能够到达 v ,那么我们称节点 u 是节点 v 的 祖先 节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#正向dfs,把start节点放到每个后续节点的ans中,每个节点作为start遍历 classSolution: defgetAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]: g = [[] for _ inrange(n)] for x,y in edges: g[x].append(y) ans = [[] for _ inrange(n)] visit = [-1] * n defdfs(x): visit[x] = start for y in g[x]: if visit[y] != start: ans[y].append(start) dfs(y) for start inrange(n): dfs(start) return ans
#逆向dfs classSolution: defgetAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]: g = [[] for _ inrange(n)] for x,y in edges: g[y].append(x) #反向dfs ans = [[] for _ inrange(n)]
defdfs(y): visit[y] = True for x in g[y]: ifnot visit[x]: dfs(x) for i inrange(n): visit = [False] * n dfs(i) visit[i] = False#除了起始点以外的途径点都为True ans[i] = [j for j,b inenumerate(visit) if b] #将途经点添加 return ans
getKthAncestor``(int node, int k) 返回节点 node 的第 k 个祖先节点。如果不存在这样的祖先节点,返回 -1 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classTreeAncestor:
def__init__(self, n: int, parent: List[int]): m = n.bit_length() - 1#位数减1 pa = [[p] + [-1] * m for p in parent] #有点dp的思想在里面 for j inrange(m): for i inrange(n): if pa[i][j] != -1: #等于-1说明已经越过根节点,无需再找爷节点 pa[i][j+1] = pa[pa[i][j]][j] self.pa = pa
defgetKthAncestor(self, node: int, k: int) -> int: for i inrange(k.bit_length()): if (k >> i) & 1: node = self.pa[node][i] if node == -1: break return node
defgetInheritanceOrder(self) -> List[str]: defdfs(cur): if cur notinself.dead: res.append(cur) for son inself.son[cur]: dfs(son) res = [] dfs(self.king) return res
classSolution: defgetCoprimes(self, nums: List[int], edges: List[List[int]]) -> List[int]: n = len(nums) # 初始化 gcds = [[] for _ inrange(51)] #注意题目,nums[i] <= 50 tmp = [[] for _ inrange(51)] ans = [-1] * n dep = [-1] * n g = [[] for _ inrange(n)]
defdfs(x: int, depth: int): dep[x] = depth for val in gcds[nums[x]]: ifnot tmp[val]: continue las = tmp[val][-1] if ans[x] == -1or dep[las] > dep[ans[x]]: ans[x] = las tmp[nums[x]].append(x) for val in g[x]: if dep[val] == -1: # 被访问过的点dep不为-1 dfs(val, depth + 1) tmp[nums[x]].pop()
for i inrange(1, 51): for j inrange(1, 51): if math.gcd(i, j) == 1: gcds[i].append(j) for x, y in edges: g[x].append(y) g[y].append(x) dfs(0, 1) return ans
#dfs classSolution: deffindChampion(self, n: int, edges: List[List[int]]) -> int: g = [[] for _ inrange(n)] for x, y in edges: g[y].append(x) visit = [False] * n ans = inf
defdfs(x): ifnot g[x]: nonlocal ans if ans == inf or ans == x: ans = x else: ans = -1 return visit[x] = True for y in g[x]: ifnot visit[y]: dfs(y) for x inrange(n): dfs(x) return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#直接遍历 classSolution: deffindChampion(self, n: int, edges: List[List[int]]) -> int: degree = [0] * n for x, y in edges: degree[y] += 1 champion = -1 for i, d inenumerate(degree): if d == 0: if champion == -1: champion = i else: return -1 return champion
classSolution: defminMalwareSpread(self, graph: List[List[int]], initial: List[int]) -> int: st = set(initial) vis = [False] * len(graph) defdfs(x: int) -> None: vis[x] = True nonlocal node_id, size size += 1 # 按照状态机更新 node_id if node_id != -2and x in st: node_id = x if node_id == -1else -2 for y, conn inenumerate(graph[x]): if conn andnot vis[y]: dfs(y)
ans = -1 max_size = 0 for x in initial: if vis[x]: continue node_id = -1 size = 0 dfs(x) if node_id >= 0and (size > max_size or size == max_size and node_id < ans): ans = node_id max_size = size returnmin(initial) if ans < 0else ans
classSolution: defminMalwareSpread(self, graph: List[List[int]], initial: List[int]) -> int: st = set(initial) vis = [False] * len(graph) defdfs(x: int) -> None: vis[x] = True nonlocal node_id, size size += 1 for y, conn inenumerate(graph[x]): if conn == 0: continue if y in st: # 按照 924 题的状态机更新 node_id # 注意避免重复统计,例如上图中的 0 有两条不同路径可以遇到 1 if node_id != -2and node_id != y: node_id = y if node_id == -1else -2 elifnot vis[y]: dfs(y)
cnt = Counter() for i, seen inenumerate(vis): if seen or i in st: continue node_id = -1 size = 0 dfs(i) if node_id >= 0: # 只找到一个在 initial 中的节点 # 删除节点 node_id 可以让 size 个点不被感染 cnt[node_id] += size
# size 取反计算最大值,相同最大值取 node_id 最小值 returnmin((-size, node_id) for node_id, size in cnt.items())[1] if cnt elsemin(initial)
classSolution: deffindOriginalArray(self, changed: List[int]) -> List[int]: changed.sort() ans = [] cnt = Counter() for x in changed: if x notin cnt: # x 不是双倍后的元素 cnt[x * 2] += 1# 标记一个双倍元素 ans.append(x) else: # x 是双倍后的元素 cnt[x] -= 1# 清除一个标记 if cnt[x] == 0: del cnt[x] # 只有所有双倍标记都被清除掉,才能说明 changed 是一个双倍数组 return [] if cnt else ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#排序+队列 classSolution: deffindOriginalArray(self, changed: List[int]) -> List[int]: changed.sort() ans = [] q = deque() for x in changed: if q: if q[0] < x: # 无法配对 return [] if q[0] == x: # 配对成功 q.popleft() # 清除一个标记 continue ans.append(x) q.append(x * 2) # 添加双倍标记 # 只有所有双倍标记都被清除掉,才能说明 changed 是一个双倍数组 return [] if q else ans
#排序+双指针 classSolution: deffindOriginalArray(self, changed: List[int]) -> List[int]: n = len(changed) if n % 2: return [] changed.sort() i = 0 res = [] while i < n: if changed[i] == 0: i += 1 else: break if i % 2: return [] else: res += [0] * (i//2) j = i + 1 double = [False] * n while i < n and j < n: while j < n and changed[j] != 2 * changed[i]: j += 1 if j == n: break double[j] = True res.append(changed[i]) i += 1 j += 1 while i < n and double[i]: i += 1 return res iflen(res) == n // 2else []
给你一个整数 hoursBefore ,表示你要前往会议所剩下的可用小时数。要想成功抵达会议现场,你必须途经 n 条道路。道路的长度用一个长度为 n 的整数数组 dist 表示,其中 dist[i] 表示第 i 条道路的长度(单位:千米)。另给你一个整数 speed ,表示你在道路上前进的速度(单位:千米每小时)。
当你通过第 i 条路之后,就必须休息并等待,直到 下一个整数小时 才能开始继续通过下一条道路。注意:你不需要在通过最后一条道路后休息,因为那时你已经抵达会议现场。
classSolution: defcombinationSum3(self, k: int, n: int) -> List[List[int]]: ans = [] path = [] defdfs(i: int, t: int) -> None: d = k - len(path) # 还要选 d 个数 if t < 0or t > (i * 2 - d + 1) * d // 2: # 剪枝 return if d == 0: # 找到一个合法组合 ans.append(path.copy()) return for j inrange(i, d - 1, -1): path.append(j) dfs(j - 1, t - j) path.pop() dfs(9, n) return ans
classSolution: defmaxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int: n = len(customers) res = 0 for i inrange(n): if grumpy[i]: grumpy[i] = customers[i] else: res += customers[i] mx = total = sum(grumpy[:minutes]) for i inrange(1,n-minutes+1): total = total + grumpy[i+minutes-1] - grumpy[i-1] mx = max(mx,total) return res + mx
1 2 3 4 5 6 7 8 9
classSolution: defmaxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int: n = len(customers) total = sum(c for c, g inzip(customers, grumpy) if g == 0) maxIncrease = increase = sum(c * g for c, g inzip(customers[:minutes], grumpy[:minutes])) for i inrange(minutes, n): increase += customers[i] * grumpy[i] - customers[i - minutes] * grumpy[i - minutes] maxIncrease = max(maxIncrease, increase) return total + maxIncrease
一个有 len 个数位的整数 x ,如果是非负数,那么 字符串****长度 为 len ,否则为 len + 1 。
1 2 3 4 5 6 7 8 9 10
classSolution: deffindColumnWidth(self, grid: List[List[int]]) -> List[int]: m = len(grid) n = len(grid[0]) res = [] for j inrange(n): max_len = 0 for i inrange(m): max_len = max(max_len,len(str(grid[i][j]))) res.append (max_len) return res
给你一个 m * n 的整数矩阵 mat ,请你将同一条 矩阵对角线 上的元素按升序排序后,返回排好序的矩阵。
1 2 3 4 5 6 7 8 9
classSolution: defdiagonalSort(self, mat: List[List[int]]) -> List[List[int]]: m, n = len(mat), len(mat[0]) for k inrange(1 - n, m): # k = i - j left_i, right_i = max(k, 0), min(k + n, m) a = sorted(mat[i][i - k] for i inrange(left_i, right_i)) for i inrange(left_i, right_i): mat[i][i - k] = a[i - left_i] return mat
公司里共有 n 名员工,按从 0 到 n - 1 编号。每个员工 i 已经在公司工作了 hours[i] 小时。
公司要求每位员工工作 至少target 小时。
给你一个下标从 0 开始、长度为 n 的非负整数数组 hours 和一个非负整数 target 。
请你用整数表示并返回工作至少 target 小时的员工数。
1 2 3 4 5 6
classSolution: defnumberOfEmployeesWhoMetTarget(self, hours: List[int], target: int) -> int: res = 0 for hour in hours: if hour >= target: res += 1 return res
import heapq classSolution: deftotalCost(self, costs: List[int], k: int, candidates: int) -> int: n = len(costs) if n > 2 * candidates: l, r = candidates, n - candidates elif n < candidates: l, r = n, n else: l, r = candidates, candidates left = costs[:l] right = costs[r:] heapq.heapify(left) heapq.heapify(right) cost = 0 while k > 0and l < r: if left[0] <= right[0]: cost += heapq.heappop(left) heapq.heappush(left,costs[l]) l += 1 else: cost += heapq.heappop(right) heapq.heappush(right,costs[r-1]) r -= 1 k -= 1 while k > 0: ifnot right: cost += heapq.heappop(left) elifnot left or left[0] > right[0]: cost += heapq.heappop(right) else: cost += heapq.heappop(left) k -= 1 return cost
给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。
请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。
1 2 3 4 5 6 7
classSolution: defaverage(self, salary: List[int]) -> float: s = sum(salary) M = max(salary) m = min(salary) n = len(salary) return (s - M - m) / (n - 2)
classSolution: defdecrypt(self, code: List[int], k: int) -> List[int]: n = len(code) res = [] if k > 0: code = code + code[:k] for i inrange(n): res.append(sum(code[i+1:i+k+1])) elif k < 0: code = code[n+k:] + code for i inrange(-k,n-k): res.append(sum(code[i+k:i])) else: res = [0] * n return res
classSolution: defcherryPickup(self, grid: List[List[int]]) -> int: m, n = len(grid), len(grid[0]) @cache # 缓存装饰器,避免重复计算 dfs 的结果(记忆化) defdfs(i: int, j: int, k: int) -> int: if i == m or j < 0or j >= n or k < 0or k >= n: return0 returnmax(dfs(i + 1, j2, k2) for j2 in (j - 1, j, j + 1) for k2 in (k - 1, k, k + 1)) + \ grid[i][j] + (grid[i][k] if k != j else0) return dfs(0, 0, n - 1)
classSolution: defevenOddBit(self, n: int) -> List[int]: even, odd = 0, 0 while n: if n % 2: even += 1 n = n >> 1 if n % 2: odd += 1 n = n >> 1 return [even,odd]