2024.01.03_学习日记

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

学习内容

  1. 公司面试题
    Alt text
    变量复用这个技巧很重要,如果需要之前的一个信息,直接用变量复用,每次遍历该数据即可,整体思路是首先生成rightup和rightdown函数判断右边是否波浪滚动,从右往左遍历生成每个位置右边是否是上下波浪,然后从左往右遍历,如果删掉该位置,那么要符合前后的一些关系才行,这里用到变量复用。记得单独算删掉最后一个位置的情况。
  2. 火柴拼正方形(leetcode473)
    Alt text
    这个题下次再刷一次,好经典的题,总体来说是判断一堆数字能否拼凑成四个大小一样的值,暴力方法是判断当前位置选择后是否超出边长,如果不超过,那就递归,如果相等,edges就-1,当前长度归0,继续递归。最核心的是status这个值,表示了0-15根火柴是否可选,用二进制表达,选了那就|(1<<i),判断是否全选就是(1<<lenth)-1,然后动态规划,只用记忆化status即可,初始化为0,如果可拼凑就是1,不行就是-1。
  3. 好子集的个数(leetcode1994,困难题)
    Alt text
    Alt text
    炫耀一下,打败100%用户!!!这个题很难,把0-30的所有数是否有质数表达成0001001010的形式,每个0或1表示当前质数是否是其因数,所以每个数字依次可以用status来表示,对于每个数组,遍历每个数字的次数,集合里每个数的状态形式分别&10位质数的状态形式,如果&后的值为0,说明可以放进去当子集,并且可以放进去这个数字的次数个,而且10位质数状态可能不止一个,是status[number]个,最后把所有的状态相加,不要忽略掉1的情况,每一个1都要×2。

学习心得

这几个题做了起码6h,太难了,今天学到了状态压缩,还有二进制的位运算。。要想好每个题递归的变量,哪些变量是必不可少的,明天继续加油。