tips
访问下一个指针时一定要考虑是否为空
当单链表需要进行逆序操作时,第一时间想到逆序
数据混乱时但依赖数值关系时想到排序
分析问题本质
树,要从叶子往根看,递归,递是遍历,归才是操作
要进行多次判断时,用一个临时值保存判断结果,最后再操作,不要一边判断一边操作
栈可以将匹配项弹出,剩下的都是不匹配的
计算长度的时候,不一定要累加,可以标记起点终点,然后相减
超时一定要检查各个循环!!!!!!80%都不是优化问题,是死在循环里面了!!注意循环条件更新和初始化!!!特别是while循环
多个数据合并想到分治
堆排序适用于需要不断插入和弹出数据再排序的情况
浮点数不能进行位操作
比较的是数据处理后的结果,比较对象就应该是处理后的数据,而不是处理前的原数据,分析目的
优化空间时,特别是连续存储,只是在输入时进行处理得到结果就行,那就没必要存储,用完就丢
算法
交换数据
1.swap,建立临时值存储
2. a=a+b; b=a-b; a=a-b;
快慢指针:两个指针同时迭代,一个每次迭代一个节点,一个每次迭代两个节点,在环形链表里终究会相遇,此时空间利用率为O(1)
队列实现栈:
队列每次插入新数据前
先将旧数据导出
再压入新数据,此时新数据就是最先进入队列的数据
再压入旧数据
每次压入的新数据就成了先入的数据,队列的性质也就先入先出,然而实际上新数据是后入的,后入先出也就成了栈的性质。
关于递归
递归在返回的时候可以同时return多个 比如 return 函数(函数,函数) , return 函数 && 函数
关于去重
去重涉及到删除和查找,数组和链表都不能很好的兼顾,目前尝试了许多排序算法,也不能做到边排序边去重,因为排序涉及到下标,而去重涉及到删除数据,长度改变下标也就会变动,会互相影响,只能先排序后去重,在排序方面优化,选择排序似乎可以优化一些,然后去重时就会少一些操作
滑动窗口
一个窗口在数据内部变化和移动,窗口右边界不断纳入新数据,每次纳入新数据就判断该数据是否在窗口内出现过,如果出现过,就将出现的位置划为新的窗口左边界,这样该数据就又成了窗口内的唯一数据,就能保证窗口内的数据无重复
哈希表数据特性
当需要使用原数组下标进行计算长度时,可以用数据作为哈希数特征,存储下标,然后出现同样数据时,就能找到之前数据的下标
双指针
需要排序,首尾指向数据相加大小比较,然后根据情况移动左右指针
优点:在原空间内进行遍历,遍历方法优秀
缺点:需要排序,占用一定时间复杂度
快慢指针的空间节约
原数据空间没用的时候,直接在原数据空间上存储新数据,快指针向后遍历。慢指针在前存储
升级:
原数据空间有用时,可以利用当前结构的空白空间,比如 数组的尾部(扩展方便,头部数据移动损耗大),然后进行反向(或者别的?)存储
新思路:头部存储也行,为了避免原数据的丢失
1. 因为数据总量一定
2. 所以当其他数据占据原数据的空间时,为了避免原数据丢失,但又不想新开辟空间保存原数据
3. 将原数据存储到插入的其他数据的原空间,进行交换,步骤变成:比较与交换
经典递推
连续 累积 从前向后推导遍历
符合条件就继续递推
不符合条件就从当前位置重新开始推导
偶数去重
异或运算
0 ^ n = n
n ^ n = 0
n ^ 0 ^ n ^ m = n ^ n ^ 0 ^ m = m
总结:异或运算满足 交换律,重复相消