ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode第269场周赛 错题分析

2021-11-28 14:05:57  阅读:188  来源: 互联网

标签:周赛 nums int List 错题 getAverages ans 269 type


第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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有