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=WoldLeft+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 ni
  • i + 1 + n − j i + 1 + n - j i+1+nj

取出三者最小值

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再来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值