[leetcode]77场双周赛
T1题目
思路
直接模拟
代码
class Solution:
def countPrefixes(self, words: List[str], s: str) -> int:
ans = 0
for w in words:
if s.startswith(w):
ans += 1
return ans
T2题目
- 最小平均差
给你一个下标从 0 开始长度为 n 的整数数组 nums 。
下标 i 处的 平均差 指的是 nums 中 前 i + 1 个元素平均值和 后 n - i - 1 个元素平均值的 绝对差 。两个平均值都需要 向下取整 到最近的整数。
请你返回产生 最小平均差 的下标。如果有多个下标最小平均差相等,请你返回 最小 的一个下标。
注意:
两个数的 绝对差 是两者差的绝对值。
n 个元素的平均值是 n 个元素之 和 除以(整数除法) n 。
0 个元素的平均值视为 0 。
思路
- 统计列表总和
- 循环过程中移动
代码
class Solution:
def minimumAverageDifference(self, nums: List[int]) -> int:
sum_ = sum(nums)
min_ = 10**9
flag = -1
s = 0
for i in range(len(nums)):
s += nums[i]
sum_ -= nums[i]
re = abs(s//(i+1)-sum_//max((len(nums)-i-1,1)))
if re<min_:
min_ = re
flag = i
return flag
T3题目
思路
- 初始化数组
- 对于每个守卫定义4个方向右下左上进行while循环走到底,没有遇到墙或者遇到新的守卫就设置为保护;
代码
class Solution:
def countUnguarded(self, m: int, n: int, guards: List[List[int]], walls: List[List[int]]) -> int:
# 初始化None 守卫:1 墙:2 保护:3
vis = [[0]*n for _ in range(m)]
ans = 0
for g in guards:
x = g[0]
y = g[1]
vis[x][y] = 1
for w in walls:
x = w[0]
y = w[1]
vis[x][y] = 2
# 定4个方向 右下左上
dx,dy = [0, 1, 0,-1],[1, 0,-1, 0]
for x, y in guards:
for i in range(4):
mpx = x + dx[i]
mpy = y + dy[i]
while 0<=mpx<m and 0<=mpy<n and vis[mpx][mpy]!=1 and vis[mpx][mpy]!=2:
vis[mpx][mpy] = 3
mpx += dx[i]
mpy += dy[i]
print(vis)
for i in range(m):
for j in range(n):
if vis[i][j]==0:
ans += 1
return ans
本文来自博客园,作者:jucw,转载请注明原文链接:https://www.cnblogs.com/Jucw/p/16212232.html