登上刷题之路
此博客链接:https://www.cnblogs.com/ping2yingshi/p/14080960.html
前言
通过看前辈对算法的分析,对于数据结构的其实就是数组和链表的组合这点,感觉如获至宝,前辈建议先刷二叉树,找套路,我这就开始刷刷二叉树,找套路(虽然疫情期间一直刷二叉树,但是由于时间和不总结原因忘得差不多了)。
参考
前辈参考链接:https://labuladong.gitbook.io/algo/
力扣官网:https://leetcode-cn.com/leetbook/
数据结构
二叉树
参考链接:https://leetcode-cn.com/leetbook/read/data-structure-binary-tree/xe17x7/
二叉树简介
只有一个前驱结点,可以有多个后继结点的链表。
二叉树笔记
先序遍历:根左右
中序遍历:左根右
后续遍历:左右根
二叉树刷题
前序遍历博客链接:https://www.cnblogs.com/ping2yingshi/p/14085288.html。
中序遍历博客链接:https://www.cnblogs.com/ping2yingshi/p/14089282.html 。
后序遍历博客地址:https://www.cnblogs.com/ping2yingshi/p/14092344.html 。
层次遍历博客链接:https://www.cnblogs.com/ping2yingshi/p/14097221.html 。
二叉树总结
1.在做二叉树的题目时,一般都有两张方法,一种是使用递归方法,一种是使用迭代方法。而使用迭代的时候,又可以分为是使用前中后序的方法迭代呢,还是使用层次遍历的方法迭代。
2.使用前中后序迭代方法时,一般使用栈。栈的特点是先进后出,所以在前序迭代时,需要先把根的右子树放入到栈中,在放左子树,在出栈时,就会先出根的左子树,在先序遍历就需要注意这点。而在中序遍历时,需要注意,中序遍历时先遍历左子树,所以要找到根的最左侧的左子树。而后序遍历和先序遍历正好是反着的,可以先先序遍历,然后利用栈的后进先出特点,可以把先序遍历后额度结果倒序输出就是后序遍历了。
递归模板
递归出口
遍历到空时结束
递归内容
判断左右子树是否为空,如果不为空则继续递归。
例如:
if(root==null) { return ; } 某种操作 if(root.left!=null){ Pre(root.left,list); } if(root.right!=null){ Pre(root.right,list); }
迭代模板
先把根节点放入到栈或者队列中
结束条件
栈或者队列为空
迭代内容
出栈或者队列操作,判断左右子树是否为空,不空添加到栈或者队列中。
例如:
while(!stack.empty()){ TreeNode temp=stack.pop(); 某种操作 if(temp.right!=null){ stack.push(temp.right); } if(temp.left!=null){ stack.push(temp.left); } }
链表
链表简介
链表笔记
链表刷题
链表总结
反转链表的某部分
思路:可以使用迭代反转链表也可以使用递归反转链表。
迭代思想:双重循环,第一层循环先找到反转链表的需要反转的头部位置,第二层循环从开始需要反转的位置反转到结束位置。
动态规划
技巧
背包
贪心
哈希
使用情况
当有大量重复元素,还需要统计重复元素,或者有两件事情,需要比较求什么东西,这种一般用哈希表就完事了。华哥推荐的果然香。
刷题博客
找不同博客链接:https://www.cnblogs.com/ping2yingshi/p/14157763.html。
找到所有数组中消失的数字博客链接:https://www.cnblogs.com/ping2yingshi/p/14143863.html。
存在重复的元素博客链接:https://www.cnblogs.com/ping2yingshi/p/14127491.html。
两个数组的交集博客链接:https://www.cnblogs.com/ping2yingshi/p/14065888.html。
重复N次的元素博客链接:https://www.cnblogs.com/ping2yingshi/p/14056380.html。
在排序数组中查找元素的第一个和最后一个位置博客链接:https://www.cnblogs.com/ping2yingshi/p/14066225.html 。
单词规律博客链接:https://www.cnblogs.com/ping2yingshi/p/14066225.html 。
存在重复元素2博客链接:https://www.cnblogs.com/ping2yingshi/p/14054440.html 。
分糖果博客链接:https://www.cnblogs.com/ping2yingshi/p/14051225.html 。
只出现一次元素:https://www.cnblogs.com/ping2yingshi/p/14045519.html 。
解密字母博客链接:https://www.cnblogs.com/ping2yingshi/p/14022559.html 。
模板总结
初始化哈希表
Map<Integer,Integer> map=new HashMap();//创建哈希表 int len=nums.length; //创建哈希表 for(Integer temp:nums) { Integer count=map.get(temp);//获取到i对应的value if(count==null) { map.put(temp,1); } else{ map.put(temp,++count); } }
取key的值做比较,然后使用key中的value值。
for(Integer i:map.keySet()) { Integer count=map.get(i); if(count==1) { // int result=map.keySet(i); return i; } }
查找
排序