15 Matching Annotations
  1. Mar 2025
    1. 在使用前缀和求解的时候,要特别注意 求解区间。

      #一定要注意到a=0的时候有边界值!!!

      def main(): n=int(input()) arr=[] for _ in range(n): arr.append(int(input()))

      sums=[0]*n
      s=0
      for i in range(n):
          s+=arr[i]
          sums[i]=s
      
      res=[]
      try:
          while True:
              a,b=map(int,input().split()) #input和int之间是逗号!逗号!
              if a==0:    #一定要注意到a=0的时候有边界值!!!
                  res.append(sums[b])
              else:
                  res.append(sums[b]-sums[a-1])
      except EOFError:
          pass
      
      for r in res:
          print(r)
      

      if name == "main": main()

    1. 59.螺旋矩阵II

      考的就是TM的边界值

      最好的就是左闭右开

      解法:

      1. 先统计绕几圈,是奇数还是偶数

      如果偶数圈,那么不用管后续; 如果奇数圈,最后记得赋值最中心的格子

      2. 再设置偏移的offset,一圈转完,横纵都进行偏移

      3. while offset<maxoffset:

      (1) 第一行赋值 (2) 最后一列赋值 (3) 最后一行赋值 (4) 第一列赋值

    1. (版本一)滑动窗口法

      我自己的写法: ``` class Solution(object): def minSubArrayLen(self, target, nums): """ :type target: int :type nums: List[int] :rtype: int """

          s=0
          min_len = float('inf')  # 必须初始化为极大值
          left=0
          right=0
      
          for right in range(len(nums)):
              s+=nums[right]    
              while(s>=target):
                  min_len=min(min_len,right-left+1)
                  s-=nums[left]
                  left+=1
          return min_len if min_len!=float('inf') else 0  #最后一定不要忘了检查是不是有这条路径啊!
      

      ```

    2. Python:

      ``` class Solution(object): def minSubArrayLen(self, target, nums): """ :type target: int :type nums: List[int] :rtype: int """

          s=0
          min_len = float('inf')  # 必须初始化为极大值
          left=0
          right=0
      
          while right<len(nums):
              s+=nums[right]
              if s<target:
                  right+=1
              else:
                  # l=right-left+1
                  # min_len=l if l<min_len else min_len
                  min_len = min(min_len, right - left + 1)
                  s-=nums[left]
                  left+=1
      
      
          return min_len if min_len!=float('inf') else 0
      

      ```

      这样子写是错误的,因为:

      1. 索引越界的直接原因: 当 right 指针到达数组末尾时(例如 right = len(nums)-1),若此时 s >= target,会进入 else 分支: · left 指针会不断右移(left += 1),直到 left 超过数组长度 · 当 left 超过数组长度后,nums[left] 会触发 IndexError

      2. 算法逻辑错误: 滑动窗口的核心逻辑应通过 动态调整窗口大小 来寻找最优解,但你的代码中: · right 指针的移动逻辑不完整(仅在 s < target 时移动 right) · 没有正确处理窗口缩小后的状态(例如在 s >= target 时仍需检查更小的窗口)

    3. 首先要思考 如果用一个for循环,那么应该表示 滑动窗口的起始位置,还是终止位置。 如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置? 此时难免再次陷入 暴力解法的怪圈。

      这句话很重要,重要的点在于如何告诉我们一个cursor去做指针的时候,他绝对不能是起始位置,因为不然终止位置也得再遍历一整个数组,相当于是两层for循环了

    1. (版本三)暴力排序法+列表推导法 class Solution: def sortedSquares(self, nums: List[int]) -> List[int]: return sorted(x*x for x in nums)

      笑死,这也太暴力了

    2. res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果

      res = [float('inf')] * len(nums) 和 res=[0]*len(nums) 是等价的,在这里都可以

    1. 代码如下:

      Python的暴力解法错误原因: 我的代码 class Solution(object): def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ size=len(nums) for i in range(size): if nums[i]==val: for j in range(i+1,size,1): nums[j-1]=nums[j] i-=1 size-=1 else: continue return size

      错误原因: - 最主要的问题是,当你在数组中移动元素时,你没有调整循环变量 i。虽然你写了 i-=1,但这在 Python 的 for 循环中不会生效,因为 i 在每次迭代后会被重新赋值。

      • 你在每次删除元素后修改了 size 的值,但是 range(size) 是在循环开始前就已经确定了循环次数,所以循环范围不会随着 size 的变化而变化。

      • 你遍历了整个数组的长度,而没有考虑到数组长度在移除元素后已经减小了。

    2. if (val != nums[fastIndex]) {

      不等于的时候才需要考虑更新,一样的话其实不用任何操作 快指针:获取元素 慢指针:指向位置

    3. 要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

      vector的erase复杂度是O(n) ,

  2. Jan 2024
    1. for this metric, you would get the average L2-distance between the unlearned model and retrained model’s predicted probabilities on the forget se

      还有K,L散度好像(看下Unlearn还是attack的论文)

    1. 还有一种没那么相关的评估是看模型对于不同扰动攻击的效果,比如针对ℓ∞ℓ∞\ell_\infty稳健的模型是否对ℓ2ℓ2\ell_2攻击也稳健?

      提高泛化性