LeetCode笔记:Weekly Contest 323

  • LeetCode笔记:Weekly Contest 323
    • 1. 题目一
      • 1. 解题思路
      • 2. 代码实现
    • 2. 题目二
      • 1. 解题思路
      • 2. 代码实现
    • 3. 题目三
      • 1. 解题思路
      • 2. 代码实现
    • 4. 题目四
      • 1. 解题思路
      • 2. 代码实现
  • 比赛链接:https://leetcode.com/contest/weekly-contest-323

1. 题目一

给出题目一的试题链接如下:

  • 2500. Delete Greatest Value in Each Row

1. 解题思路

这一题的话只要对每一行做一个排序,然后取每一列的最大值相加即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def deleteGreatestValue(self, grid: List[List[int]]) -> int:
        n, m = len(grid), len(grid[0])
        for i in range(n):
            grid[i] = sorted(grid[i])      
        return sum(max(grid[i][j] for i in range(n)) for j in range(m))

提交代码评测得到:耗时187ms,占用内存18.4MB。

2. 题目二

给出题目二的试题链接如下:

  • 2501. Longest Square Streak in an Array

1. 解题思路

这一题我们只需要遍历一下每一个数作为起始点时其能够形成的平方数列的最大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def longestSquareStreak(self, nums: List[int]) -> int:
        nums = sorted(nums)
        s = set(nums)
        visited = set()
        res = -1
        for i in nums:
            if i in visited:
                continue
            cnt = 1
            visited.add(i)
            while i*i in s:
                i = i*i
                visited.add(i)
                cnt += 1
            if cnt >= 2:
                res = max(res, cnt)
        return res

提交代码评测得到:耗时2888ms,占用内存34.1MB。

3. 题目三

给出题目三的试题链接如下:

  • 2502. Design Memory Allocator

1. 解题思路

这一题倒是没啥好的思路,按照题意给出了一个最为暴力的解法,不过万幸没有超时,就先凑合用了……

2. 代码实现

给出python代码实现如下:

class Allocator:
    def __init__(self, n: int):
        self.mem = [0 for _ in range(n)]

    def allocate(self, size: int, mID: int) -> int:
        cnt = 0
        for i, x in enumerate(self.mem):
            if x == 0:
                cnt += 1
            else:
                cnt = 0
            if cnt == size:
                for j in range(i-size+1, i+1):
                    self.mem[j] = mID
                return i-size+1
        return -1

    def free(self, mID: int) -> int:
        cnt = 0
        for i, x in enumerate(self.mem):
            if self.mem[i] == mID:
                self.mem[i] = 0
                cnt += 1
        return cnt

提交代码评测得到:耗时6766ms,占用内存14.5MB。

4. 题目四

给出题目四的试题链接如下:

  • 2503. Maximum Number of Points From Grid Queries

1. 解题思路

这一题我的思路就是找到所有的临界漫溢情况,然后根据query去定位可以访问的格点的数目即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maxPoints(self, grid: List[List[int]], queries: List[int]) -> List[int]:
        n, m = len(grid), len(grid[0])
        seen = {(0, 0)}
        q = [(grid[0][0], 0, 0)]
        _max = grid[0][0]
        ans = {}
        cnt = 0
        while q:
            v, i, j = heapq.heappop(q)
            cnt += 1
            if v > _max:
                _max = v
            ans[_max] = cnt
            if i-1 >= 0 and (i-1, j) not in seen:
                heapq.heappush(q, (grid[i-1][j], i-1, j))
                seen.add((i-1, j))
            if i+1 < n and (i+1, j) not in seen:
                heapq.heappush(q, (grid[i+1][j], i+1, j))
                seen.add((i+1, j))
            if j-1 >= 0 and (i, j-1) not in seen:
                heapq.heappush(q, (grid[i][j-1], i, j-1))
                seen.add((i, j-1))
            if j+1 < m and (i, j+1) not in seen:
                heapq.heappush(q, (grid[i][j+1], i, j+1))
                seen.add((i, j+1))
        
        ans = sorted(ans.items())
        n = len(ans)
        
        def query(q):
            idx = bisect.bisect_left(ans, (q, 0))
            if idx == 0:
                return 0
            else:
                return ans[idx-1][1]
            
        return [query(q) for q in queries]

提交代码评测得到:耗时2829ms,占用内存42.1MB。

你可能感兴趣的:(leetcode笔记,周赛,323,leetcode,2500,leetcode,2501,leetcode,2502,leetcode,2503)