1. 题目一
给出题目一的试题链接如下:
1. 解题思路
这一题描述得有点复杂,但是其实就是取最大值算一个等差数列求和即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def maximizeSum(self, nums: List[int], k: int) -> int:
x = max(nums)
return (x + x+k-1) * k // 2
提交代码评测得到:耗时198ms,占用内存16.3MB。
2. 题目二
给出题目二的试题链接如下:
1. 解题思路
这一题要看某一个位置上两侧都有多少个元素已经出现过了,我们事实上只要分别找到两个数组当中某个元素最早同时出现的位置即可,之后后续所有的位置上求总数都得带有这个值,因此就变成了一个累计数组的问题了。
2. 代码实现
给出python代码实现如下:
class Solution:
def findThePrefixCommonArray(self, A: List[int], B: List[int]) -> List[int]:
n = len(A)
cnt = [0 for _ in range(n)]
index = {}
for i, x in enumerate(A):
index[x] = i
for i, x in enumerate(B):
cnt[max(i, index[x])] += 1
return list(accumulate(cnt))
提交代码评测得到:耗时151ms,占用内存16.4MB。
3. 题目三
给出题目三的试题链接如下:
1. 解题思路
这一题有多种思路,我这边采用了一个比较直接的思路,就是把每一个池子用DSU聚类,然后对每一个池子里的鱼求和然后返回最大值。
2. 代码实现
给出python代码实现如下:
class DSU:
def __init__(self, n, m):
self.width = m
self.root = [i for i in range(n * m)]
def _find(self, k):
if self.root[k] == k:
return k
return self._find(self.root[k])
def find(self, i, j):
k = i * self.width + j
if self.root[k] == k:
return k
return self._find(self.root[k])
def union(self, i, j, a, b):
x = self.find(i, j)
y = self.find(a, b)
if x != y:
self.root[y] = x
return
class Solution:
def findMaxFish(self, grid: List[List[int]]) -> int:
n, m = len(grid), len(grid[0])
dsu = DSU(n, m)
def is_water(i, j):
return 0 <= i < n and 0 <= j < m and grid[i][j] != 0
for i in range(n):
for j in range(m):
if grid[i][j] == 0:
continue
if is_water(i+1, j):
dsu.union(i, j, i+1, j)
if is_water(i, j+1):
dsu.union(i, j, i, j+1)
cnt = defaultdict(int)
for i in range(n):
for j in range(m):
cnt[dsu.find(i, j)] += grid[i][j]
return max(cnt.values())
提交代码评测得到:耗时307ms,占用内存16.4MB。
4. 题目四
给出题目四的试题链接如下:
这一题我实在是没啥思路,但是看头几名的大佬都基本上是瞬秒的,从他们的答案来看好像使用了一个叫做Fenwick Tree,或者Binary Indexed Tree的结构,感觉应该是比较常见的套路题目。
但是很可惜这个数据结构我并不了解,因此只能是放弃了,后面得去学习一下这个数据结构到底是个啥……