[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题目

  1. 最小平均差

给你一个下标从 0 开始长度为 n 的整数数组 nums 。

下标 i 处的 平均差 指的是 nums 中 前 i + 1 个元素平均值和 后 n - i - 1 个元素平均值的 绝对差 。两个平均值都需要 向下取整 到最近的整数。

请你返回产生 最小平均差 的下标。如果有多个下标最小平均差相等,请你返回 最小 的一个下标。

注意:

两个数的 绝对差 是两者差的绝对值。
 n 个元素的平均值是 n 个元素之 和 除以(整数除法) n 。
0 个元素的平均值视为 0 。

思路

  1. 统计列表总和
  2. 循环过程中移动

代码


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题目

思路

  1. 初始化数组
  2. 对于每个守卫定义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

posted @ 2022-05-01 09:39  jucw  阅读(38)  评论(0编辑  收藏  举报