手撕算法
WangQ~
这个作者很懒,什么都没留下…
展开
-
手撕算法——LinkedHashMap相关的题型
class Node{ public int key; public int val; Node(int key,int val){ this.key=key; this.val=val; }}class LRUCache { /* 缓存满了的时候,选择未使用的时间最长的置换出去 */ private Deque<Node> deque; private Map<Integer,Node>原创 2020-06-24 20:30:24 · 128 阅读 · 0 评论 -
手撕算法——二叉树面试题目汇总
二叉树遍历先序遍历递归class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<>(); if(root==null){ return list; } helper(list,root); return原创 2020-06-17 10:04:10 · 382 阅读 · 0 评论 -
手撕算法——单调栈
单调栈模板Stack<Interger> stack=new stack<>();for(int i=0;i<nums.length;i++){ while(!stack.empty()&&nums[i]>stack.peek()){ //记录结果 } stack.push(nums[i]);}while(!stack.empty()){ //处理剩余元素}相关题型下一个更大的元素题目描述:496. 下一个更大元素 I给定两原创 2020-06-15 10:28:50 · 183 阅读 · 0 评论 -
手撕算法——递归
递归及相关题型递归在力扣刷题中经常用到,最常见的就是使用递归来遍历二叉树。因此今天总结一下递归求解问题的套路以及常考的面试题,能力有限,如有不对大家多多指教。递归解题思路递归,就是在函数内部调用函数本身,因此递归适用于求解可以将一个问题拆分为一个个相同子问题的题目。如二叉树的遍历可以拆分求解左子树的遍历和右子树的遍历两个子问题。我们将递归解题的套路归结为以下三点:(1)考虑递归终止条件是什么(2)当前应该做什么(3)交给递归去做什么(4)返回结果是什么以二叉树遍历为例子public Lis原创 2020-06-10 09:51:02 · 223 阅读 · 0 评论 -
手撕算法——归并排序及排序链表
归并排序对于归并排序,大家怕是都不陌生,也可以非常熟练的写出归并排序的代码,因此本篇文章的重点并不是向大家介绍归并排序,而是讨论归并排序的拓展题型——力扣:148.排序链表。至于归并排序的原理可以参考:图解排序算法(四)之归并排序,下面也贴出代码实现代码实现/**归并排序 分而治之 通过递归分,然后merge */public class MergeSort { public void sort(int[] a,int begin,int end,int[] tmp){原创 2020-05-30 10:13:25 · 196 阅读 · 0 评论 -
手撕算法——打家劫舍
打家劫舍198. 打家劫舍打家劫舍问题是一个经典的动态规划问题,但是当我做中兴的笔试题的时候,竟然输在没有读懂题目上,归根节点,还是对该类问题的不熟悉。同时,自己的阅读能力也有待提升直接上代码class Solution { public int rob(int[] nums) { if(null==nums||nums.length<=0){ return 0; } if(nums.length==0){原创 2020-05-29 22:53:09 · 226 阅读 · 0 评论 -
手撕算法——搞定BFS
BFS的答题模板BFS,广度优先搜索答题模板(1)创建队列(2)将头结点放入队列(3)当队列不为空的时候进行遍历Queue<T> queue=new LinkedList<>();queue.add(root);while(!queue.isEmpty()){ T node = queue.poll(); for(...){ //将符合条件的节点加入队列中 }}层次遍历二叉树题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层原创 2020-05-28 18:04:30 · 175 阅读 · 0 评论 -
手撕算法——字母异位词分组
题目描述49. 字母异位词分组给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]说明:所有输入均为小写字母。不考虑答案输出的顺序。分析:具有相同字母的不同字符串分为一组。解法一:将每个字符串都进行排序,然后存入Map中,比如 tea, eat排序之后原创 2020-05-28 16:34:38 · 249 阅读 · 0 评论 -
手撕算法——二叉树中和为某一值的路径及变形
二叉树树中和为某一值的路径,该题目是剑指offer上的一道题目,第一次刷题的时候一次就过了,所以没有当回事,当我遇到一个该题目的变形题的时候却一直通过不了,发现自己还是眼高手低,因此重新总结和记录一下。二叉树中和为某一值的路径题目描述面试题34. 二叉树中和为某一值的路径输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22,返回:分析: 寻找二叉树中和为某一值的原创 2020-05-28 08:03:09 · 147 阅读 · 0 评论 -
手撕算法——01背包问题
题目描述01背包问题有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000原创 2020-05-27 21:30:07 · 223 阅读 · 0 评论 -
手撕算法—— 最长回文子串
题目描述最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”解题思路看到这道题的时候,第一眼能想到的方法就是暴力破解,枚举每个子串,看它是不是回文子串,并且记录最长的回文子串。它的时间复杂度为O(N^3),空间复杂度为O(N),这里N指的是数组的长度。时间复杂度为O(N^3)的原因是使用两层for原创 2020-05-26 12:13:40 · 210 阅读 · 0 评论 -
手撕算法——缺失的第一个整数
题目描述给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1提示:你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。思路分析思路一:先排序在寻找如果这道题没有没有时间复杂度和空间复杂度的要求,相信大家能很轻松的写出来,比如直接对数组进行排序,然后比较得到第一个缺失的数。代码如下:class Sol原创 2020-05-25 09:56:51 · 169 阅读 · 0 评论 -
手撕算法-位运算
位运算位运算是把数字用二进制表示后,对每个位置上的0或者1 的运算二进制中的1的个数方法一:会导致死循环的方法public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int cnt=0; while(n!=0){ if((n&1)!=0){原创 2020-05-24 23:53:25 · 192 阅读 · 0 评论