- 课后题目与数据结构课后题:汇总思想,回炉消化应用的思想,形成自己的做题思考资料库-在经典与精
- 做题leetcode的程度:开始掌握应用 每个知识点总结
- 技巧:
- 启发式思维
- 图画式理解思维
- 简化逻辑
算法思想:分治+减治+小技巧
数组-基础(下面大部分应用数组的去操作)
//每一类数组题目:必会
个人答题思路
字符串
- 子序列:不一定连续;子串:连续
数论
枚举
- 位运算技巧
- 聪明的枚举:众数的优化
- 二进制枚举:
- 一般的是10进制枚举
- 二进制枚举例题:1000瓶毒药,2^10 = 1024 转化成二进制
分治与减治
贪心
- 解题步骤:建模,分解子问题,最优子结构,状态转移
动态规划
- 动态规划:重叠子问题的改进:制表记忆+自下而上
- 制表与记忆
- 递归:自上而下;递推:自下而上
- 最大递增子序列和(和数组相关的这一堆题目)
- 背包问题的解决策略:
数据结构经典算法实现:pseudo code
数据全集:向量链表,栈,搜索树,词典——>在数据元素之间维护显式/隐式(词典)的全序关系
优先级队列:操作对象限定于当前的全局极值者,根据数据对象之间相对优先级对其进行访问
一、贪心与动规策略思想+递归与迭代操作:搜索问题的处理
1. 栈操作
- 进制转换算法
借助栈操作:s.push(digit[当前位数值]) O(lgn)
1. 递归:尾递归
2. 迭代
- 左右括号匹配
**括号(变量/不定量)** 入栈暂存,迭代出栈匹配操作:O(n)
- 表达式S求值:顺便并转换为逆波兰式RPN
1. 运算数栈opnd暂存**操作数(变量)**,运算符栈optr暂存运算符,迭代比较**运算符优先级(变量)**
2. 栈顶运算符高时进行操作
3. 小trick:/细节处理/
4. 利用判断操作符栈是否为空跳出循环条件,初始增加'\0',匹配字符串S的结束符
5. 当下进入操作处理时:根据需要的操作数个数划分为一元操作符!和二元操作符
6. RNP逆波兰表达式的性质:操作数位置不变,运算符位置根据运算先后顺序从左到右依次排列:因此对S处理时,遇到操作数直接添加到RPN和运算符栈,遇到操作符判断优先级,当下处理时添加该运算符到RPN中
- RPN求值算法
//输入:RPN
//输出:数值
1. 引入栈存放操作数
2. while遍历RPN字符串{
3. 如果是运算符取数操作,结果存入栈
4. 如果是操作数,存栈
5. }
6. 返回栈顶
2. 数据组查找:数据-词条与字符串
词典(同类映射):词条(key, value),循值访问更为自然,适用范围更广
- 跳转表
数据结构:Skiplist跳转表
跳转表的底层实现方式:四联表quadlist
//查找
//插入
//删除