LeetCode编程总结

# 1、在有序表中查找两数组指定的和,双指针法
# 2、滑动窗口 : 连续子数组之和
# 3、二分查找 : 顺序数组中查找特定的值

# 4、递归程序的真正的构建是从底向上的,这就是为什么递归终止条件要写在最前面
# 参见 反转链表的递归程序 LeetCode206

# 5、 链表归并排序的递归过程,要好好体会一下

# 6、树型的暴力搜索(全路径搜索 、DFS )需要进行回溯 参见 LeetCode 93

# 7、利用 return 能使树型递归提早结束,类似于DFS 参见 LeetCode 37

# 8、记忆化搜索,自上而下的解决问题、 动态规划,自下而上的解决问题 参见斐波那契数列

# 9、记忆化递归时,一开始就需要判断原问题是否被再次遇到,若遇到则返回记忆值,若没遇到则
# 进入递归过程,并更新记忆值 错误来源参见 LeetCode 198

# 10、递归返回的过程,其实就是自底向上的构建过程(类似于动态规划)、 参见 LeetCode 337 刘宇波代码3

# 11、深度递归和层次递归的感悟: 参见LeetCode 322
#深度递归需要使用传递状态参数,并一般使用全局变量更新最优解
#层数递归只需要考虑底层和上一层的递推关系,一般不使用全局变量

# 12、01背包问题:一个序列的各个元素都有选与不选两种状态
# 20190113

# 13、数组的记忆化递归和字典的记忆化递归? LeetCode 137 20190119

# 14、动态规划难的是状态的定义, 如 LeetCode 376 上升沿和下降沿的状态

# 15、动态规划状态定义的一般原则是F(n,r):n是问题规模,r是该规模下的特定限定,比如LeetCode 376
# 的状态定义就是一个很好的启示

# 16、动态规划总结:1)解空间树加重复子问题 生长学习法
# 2)最优问题: 最大值最小值……
# 3)子问题的同质: 都是连续序列、矩阵……
# 4)重复问题: 空间换时间 状态矩阵
# 5)从顶向下:记忆数组 从底向上:递推 终局思想 本质是同一个东西。 20190228


# 17、编程要注意状态的定义,变量的代表含义 ,如直接插入排序 j代表a[i]直接要插入的空预留位值,j-1 要不断的
# 与temp=a[i] 比较 :即要找到 a[i] 插入的最终位置。


# 算法面试一定要先实现出来,然后再考虑优化的可行性。
# 算法注重的是思想,如leetcode 108 怎样才能想到用递归的思想呢?
# 总的来说还是我的编程思想的素养不够呀 --20190305
# 编程题要进行一定的抽象建模 如 LeetCode 235 二叉树搜索树的公共祖先问题。
# 编程时一定要注意函数的定义是什么? 如Leetcode 236 函数的定义是返回最终的答案 20100305
# 编程问题也要注意分治讨论:即划分问题的子空间:
# 如 leetcode404 : 1)根节点有左叶子 2)根节点没左叶子


# 20190302 找工作期间 总结
#18、 数组类问题:
# 1)滑动窗口
# 2)查找表
# 解空间树
# 1)初值状态的确定
# 2)搜索策略 : 剪支 (优化问题)
# 递归和分治类问题:是个基本的编程思想(函数的定义很重要)
# 1)递归返回值的处理:
# 要定义好函数的返回逻辑或状态或者值,并从底向上构建
# 如 leetcode 108 和 113 20190305
# 2)递归程序的编写:
# # 先写返回条件
# 返回条件写好了,就可以当做函数功能已经完成,并可以分治的解决问题了
# 3) 数据结构有递归结构,要考虑一下递归的算法
# 如数组、链表、二叉树等 20190305
# 4)visit 数组用于去重
# 5)状态出栈用于回溯
# 动态规划:
# 1)初值的设定是关键:a 状态函数的定义可以说明函数的初值 如 01背包问题
# b 初值的设置技巧可以用最小规模数据进行验证
# 2)状态的递推顺序:新值必须在旧值的基础上
# 20190306
# 贪心:最强烈的状态给最强烈的需求 :分饼干 20190306
# 1)证明过程只能是反证法
#
原文地址:https://www.cnblogs.com/lux-ace/p/10546981.html