Skip to content

jcuan/somecode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

刷题记录

leetcode还有看以前数据结构ppt遇到的

xxx0、xxx1分别代表同一问题的不同解法,后边数字大的一般更好,文件名代表leetcode题目链接编号

think

通用

  1. 不要僵化地实现算法
    • 涉及到反向等场景,想想中间容器是不是必须的,能否直接在原数据上操作或者直接保存结果:jianzhioffer2/go/58.go
    • 分了很多个组一定要有什么group编号吗?不见得,通过step或者delta就行:希尔排序 看看生硬的ShellSort_rubbish
  2. 涉及到值转换(在不同的标准下值不同)的情况下,不要误用
    • jianzhioffer2/go/7.go中的forBuildTree2中的valInorderIndexMap[root.Val]+1,使用的是origin的index,但是误传入了进行了下标转换的indexInorder
  3. 注意所有的循环遍历查找是否可以通过转换获得相关值
  4. 分清递归需要调用的函数,leetcode/jianzhioffer2/go/26.go, 在递归函数forIsSubStructure0出现了特殊的开始节点规避,是很stupid的做法,正确的是forIsSubStructure的实现,这个递归的处理,该在外层函数
  5. 精简返回值:(
    • leetcode/jianzhioffer2/py/54.py inorder注释的那个实现可以说是非常垃圾了
    • go有些文章推荐使用int而不是uint本来就是因为负值可以代表很多的含义,leetcode/jianzhioffer2/go/55.gogetBalancedInfo最初还使用了一个error返回值来代表是否已经检测到失衡,实际上一个-1已经足够
  6. 问题的进一步抽象,可以简化算法,增加可读性
    • 矩阵的顺序遍历 开始没有引入top、down这种界限限制,导致下标操作可读性差,且存在后续的特殊处理
  7. 涉及到循环然后再回退(减多了)的情况,考虑一下是否可以不回退,不回退可能可读性高很多

语言特定

  1. go的stack,一般用动态数组即可,不需要使用list。nonleetcode/go/simple_expression_cal.go
  2. 关于不要僵化地实现算法中,避免中间容器的使用,jianzhioffer2/go/7.go::buildTree3buildTree2可以参考,不过可能大大牺牲了可读性,2->3主要是为了降低内存使用
  3. copy拷贝的长度为src和dst的最小值
  4. 在switch case中使用break,跳出的是switch case

总结

  1. 二叉树的递归和非递归遍历算法,都需要掌握,因为非递归方式保存了父节点的信息,很多题是或者可以是这种场景的变化
  2. 二分法自己的原则:两端取等、中间偏左
    • leetcode/jianzhioffer2/py/11.py这道题错了非常多次,因为采用了中间偏左,即mid = (start + end) // 2的方式,所以有可能存在mid=end-1=start的情况,此时要收缩右部的区间,end=mid而不是end=mid-1!!

数据结构和算法汇总

排序

可以使用这个题目验证https://leetcode-cn.com/problems/sort-an-array/submissions/

回溯

非递归实现的效率贼低还贼复杂,非常不直观,调试了很久,难点主要在回退的处理

线性表

查找和遍历

重复的不太重要的:

特殊查找

字符串

动态规划

https://zhuanlan.zhihu.com/p/91582909

空间复杂度优化主要从状态转移方程入手

重复:

数学推导和运算

Releases

No releases published

Packages

No packages published