周赛 Weekly Contest 403
https://leetcode.cn/contest/weekly-contest-403/
- 1
- 2
- 3
- 4 (Late Submission, AC after competition finished)
4/4
今天11点才开始周赛,半小时ak前三题,然后花了一小时多才AC第四题, mark 第一次 ac 第四题
100342. Minimum Average of Smallest and Largest Elements
Solution:
- Array Traversal
第一题花了十分钟,属实不应该
todo:
- python 数组删除元素不熟悉?应该不是,就是手搓太慢了而已
class Solution:
def minimumAverage(self, nums: List[int]) -> float:
ans = 200
for i in range(len(nums)//2):
minN = 100
maxN = -1
minI = 0
maxI = 0
for j in range(len(nums)):
if nums[j] != -1:
if minN > nums[j]:
minI = j
minN = nums[j]
if maxN < nums[j]:
maxI = j
maxN = nums[j]
nums[minI] = -1
nums[maxI] = -1
# print(minI, maxN, minI, maxI)
ans = min(ans, (minN + maxN) / 2)
return ans
100334. Find the Minimum Area to Cover All Ones I
Solution:
- Array Traversal
class Solution:
def minimumArea(self, grid: List[List[int]]) -> int:
upperI, lowerI = -1, -1
leftJ, rightJ = -1, -1
for i in range(len(grid)):
if sum(grid[i]) > 0:
if upperI == -1: upperI = i
lowerI = i
columnS = []
for j in range(len(grid[0])):
s = 0
for i in range(len(grid)):
s += grid[i][j]
columnS.append(s)
if s > 0:
if leftJ == -1: leftJ = j
rightJ = j
return (lowerI - upperI + 1) * (rightJ - leftJ +1)
100337. Maximize Total Cost of Alternating Subarrays
Solution:
- Status DP
todo:
- 状态压缩是什么,为什么叫状态压缩
class Solution:
def maximumTotalCost(self, nums: List[int]) -> int:
@cache
def dp(i, positive):
if i == len(nums):
return 0
if positive:
return nums[i] + max(dp(i+1, False), dp(i+1, True))
else:
return -nums[i] + dp(i+1, True)
return dp(0, True)
100332. Find the Minimum Area to Cover All Ones II
Solution:
- Array Traversal
- Enumerate all possibilities
todo:
- Better solution
- 贴瓷砖 https://leetcode.cn/problems/tiling-a-rectangle-with-the-fewest-squares/description/
- 蒙德里安的梦想
class Solution:
def minimumSum(self, grid: List[List[int]]) -> int:
def findMinArea(i1, i2, j1, j2):
if j1 > j2 or i1 > i2:
return 0
upperI, lowerI = -1, -1
leftj, rightJ = -1, -1
for i in range(i1, i2 + 1, 1):
s = 0
for j in range(j1, j2 + 1, 1):
s += grid[i][j]
if s > 0:
if upperI == -1:
upperI = i
lowerI = i
for j in range(j1, j2 + 1, 1):
s = 0
for i in range(i1, i2 + 1, 1):
s += grid[i][j]
if s > 0:
if leftj == -1:
leftj = j
rightJ = j
if lowerI == -1 or rightJ == -1:
return 0
return (lowerI - upperI + 1) * (rightJ - leftj + 1)
def dp(lefti, i, leftj, j, times):
if times == 1:
return findMinArea(lefti, i, leftj, j)
ans = float("inf")
if times == 2:
for i2 in range(lefti, i):
ans = min(ans, findMinArea(i2 + 1, i, leftj, j) + dp(lefti, i2, leftj, j, 1))
for j2 in range(leftj, j):
ans = min(ans, findMinArea(lefti, i, j2 + 1, j) + dp(lefti, i, leftj, j2, 1))
# for i1 in range(lefti, i):
# for j1 in range(leftj, j):
# a1 = findMinArea(lefti, i1, leftj, j1)
# a2 = findMinArea(i1 + 1, i, leftj, j1)
# a3 = findMinArea(lefti, i1, j1 + 1, j)
# a4 = findMinArea(i1 + 1, i, j1 + 1, j)
# count = (a1 > 0) + (a2 > 0) + (a3 > 0) + (a4 > 0)
# if count == 2:
# ans = min(ans, a1 + a2 + a3 + a4)
if times == 3:
for i2 in range(lefti, i):
ans = min(ans, findMinArea(i2 + 1, i, leftj, j) + dp(lefti, i2, leftj, j, 2))
ans = min(ans, dp(i2 + 1, i, leftj, j, 2) + findMinArea(lefti, i2, leftj, j))
for j2 in range(leftj, j):
ans = min(ans, findMinArea(lefti, i, j2 + 1, j) + dp(lefti, i, leftj, j2, 2))
ans = min(ans, dp(lefti, i, j2 + 1, j, 2) + findMinArea(lefti, i, leftj, j2))
for i1 in range(lefti, i):
for j1 in range(leftj, j):
a1 = findMinArea(lefti, i1, leftj, j1)
a2 = findMinArea(i1 + 1, i, leftj, j1)
a3 = findMinArea(lefti, i1, j1 + 1, j)
a4 = findMinArea(i1 + 1, i, j1 + 1, j)
count = (a1 > 0) + (a2 > 0) + (a3 > 0) + (a4 > 0)
# print(count, i1, j1, i, j)
if count == 3:
ans = min(ans, a1 + a2 + a3 + a4)
return ans
return dp(0, len(grid) - 1, 0, len(grid[0]) - 1, 3)