LeetCode第269场周赛 错题分析
作者:互联网
第269周赛
文章目录
题目很简单,只ac了3道,第4道差一点点。
我还是太菜了,会继续努力训练思路和速度的。
5938.找出数组排序后的目标下标
class Solution(object):
def targetIndices(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
ans = []
nums.sort()
for i, w in enumerate(nums):
if w == target:
ans.append(i)
return ans
之前的忘了保存,又写了一遍,主要是为了加深新学的语句:
for i, w in enumerate(nums):
# i 表示数组下标
# w 表示数组下标对应的值
# enumerate 枚举
5939.半径为k的子数组平均值
class Solution(object):
def getAverages(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
ans = [0] * len(nums)
# 遍历 nums
for i, w in enumerate(nums):
if i - k < 0 or i + k >= len(nums):
ans[i] = -1
else:
ans[i] = sum(nums[i - k : i + k + 1]) // (2 * k + 1)
return ans
A = Solution()
print(A.getAverages([7,4,3,9,1,8,5,2,6], 3)) # [-1,-1,-1,5,4,4,-1,-1,-1]
print(A.getAverages([1000], 0)) #1000
print(A.getAverages([8], 10000))
这是我的第一版,很明显超时,不必要的重复求和计算
第二版滥用除法导致结果相差一
经验教训,遇到需要整除或向下取整这些东西,尽量只使用一次,即在获取最终结果时
W
n
e
w
=
W
o
l
d
−
L
e
f
t
+
R
i
g
h
t
a
n
s
=
[
W
n
e
w
2
×
k
+
1
]
W_{new} = W_{old} - Left + Right \\ ans = [\frac{W_{new}}{2\times k + 1}]
Wnew=Wold−Left+Rightans=[2×k+1Wnew]
Left 表示上一次的最左边的数,Right表示这一次的最右边的数
class Solution(object):
def getAverages(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
ans = [0] * len(nums)
temp = -1 # 存放上一次值
num = 0 # 上一个左边界点
# 遍历 nums
for i, w in enumerate(nums):
if i - k < 0 or i + k >= len(nums):
ans[i] = -1
elif temp == -1:
temp = sum(nums[i - k : i + k + 1])
num = nums[i - k]
ans[i] = temp // (2 * k + 1)
else:
temp = temp + nums[i + k] - num
ans[i] = temp // (2 * k + 1)
num = nums[i - k]
return ans
A = Solution()
print(A.getAverages([7,4,3,9,1,8,5,2,6], 3)) # [-1,-1,-1,5,4,4,-1,-1,-1]
print(A.getAverages([1000], 0)) #1000
print(A.getAverages([56725,48784,74934,6772,98570,96847,46483,6592,62552], 1))
print(A.getAverages([40527,53696,10730,66491,62141,83909,78635,18560], 2))
5940.从数组中移除最大值和最小值
我自己做的是左右两次遍历,没有保存,但是我也不想再回顾,因为是瞎写的,虽然通过了
我看看大佬们的思路 看的是灵茶山艾府
大佬之所以是大佬,是思路加手速~
贪心算法
- 都在前面一起删除,删除一次
- 都在后面一起删除,删除一次
- 一个在前面,一个在后面,分开删除,步骤加起来
难的是怎么用代码表示
做题之前需要用数学语言表示
假设数组长度为 n n n, 最小值在 i i i, 最大值在 j j j, 并且 i < = j i<=j i<=j, 则按上面的三种情况分别删除
- j + 1 j+1 j+1
- n − i n-i n−i
- i + 1 + n − j i + 1 + n - j i+1+n−j
取出三者最小值
class Solution(object):
def minimumDeletions(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 取出极值及其索引
Min = min(nums)
Max = max(nums)
minIndex = nums.index(Min)
maxIndex = nums.index(Max)
# 必要时交换两个值,为了和数学语言一致
if minIndex > maxIndex:
maxIndex, minIndex = minIndex, maxIndex
# 计算三种策略的值
step = [0, 0, 0]
step[0] = maxIndex + 1
step[1] = len(nums) - minIndex
step[2] = minIndex + 1 + len(nums) - maxIndex
return min(step)
经验教训 第1题一般送分直接盲写,23题最好想清楚数学原理后,再想想怎么用程序语言表示,最后再动手写代码。
5941.找出知晓秘密的所有专家
class Solution(object):
def findAllPeople(self, n, meetings, firstPerson):
"""
:type n: int
:type meetings: List[List[int]]
:type firstPerson: int
:rtype: List[int]
"""
ans = []
def takeThird(elem):
return elem[2]
meetings.sort(key = takeThird)
isKnow = [0] * n
isKnow[0] = 1
isKnow[firstPerson] = 1
for lis in meetings:
if isKnow[lis[0]] == 1 or isKnow[lis[1]] == 1:
isKnow[lis[0]] = 1
isKnow[lis[1]] = 1
for i, w in enumerate(isKnow):
if w == 1:
ans.append(i)
return ans
只过了37/42,没有考虑同时性
def takeThird(elem):
return elem[2]
meetings.sort(key = takeThird)
# 表示按二维列表的第三列升序排序
先空着吧,等我学了并查集和BFS再来
标签:周赛,nums,int,List,错题,getAverages,ans,269,type 来源: https://blog.csdn.net/m0_46459047/article/details/121590566