2024.03.19_学习日记

天气:晴
学习地点:学校
学习时长:8h

学习内容

  1. lc450
    alt text
    alt text
    alt text
    删除一个节点以后,关键的是要用右子树的最小值或者左子树的最大值来替换当前节点,同时递归删除对应子树的节点。
  2. 滑动窗口
    alt text
    该算法的核心思想是利用双端队列维持当前滑动窗口内的最大值。队列的首部始终保存当前窗口的最大值的索引,而队列本身保持递减顺序。这样每次滑动窗口移动时,只需要比较新进入窗口的元素与队尾元素;如果更大,则弹出队尾元素,直到该条件不满足为止,然后将新元素加入队列。同时,检查队首元素是否已经不在窗口内,如果是,则将其从队首移除。这种方法的时间复杂度为 O(n),因为每个元素最多被压入和弹出队列一次。
    alt text
  3. 解数独
    alt text
    alt text
    alt text
    这段代码实现了一个典型的回溯算法来解决数独问题。它首先遍历每个空白位置(用.表示),然后尝试填充数字1到9,每次填充后都会递归地尝试解决剩下的数独。如果在某个位置上所有数字都不能导致一个有效解决方案,算法会回溯到之前的状态,尝试下一个数字。这个过程一直持续,直到找到有效解决方案或确定数独无解。
  4. 汉明重量
    alt text
    alt text
    删掉最后一个1就是n&=n-1。二进制表达方式就是bin(8)
  5. 煎饼排序
    alt text
    alt text
    煎饼排序的基本思想是在每一步找到未排序部分的最大元素,并通过最多两次翻转操作将其移动到未排序部分的末尾。
  6. 和为k的数组
    alt text
    alt text
    遍历数组,计算每个位置的前缀和,并使用字典 dic 记录每个前缀和出现的次数。在遍历过程中,如果存在前缀和为 pre - k 的子数组,说明存在一个和为 k 的子数组,因此更新计数器 count。最后返回 count 即可得到满足条件的子数组数量。