算法
算法学习
小啊小李子
这个作者很懒,什么都没留下…
展开
-
一个框架解决回溯算法
什么是回溯算法,先上百度百科定义:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。总结,如下图,如果我们需要知道下图中从顶点1-5有多少条路原创 2021-05-02 21:56:20 · 415 阅读 · 3 评论 -
leetcode 652. 寻找重复的子树 题解 java实现
力扣 652. 寻找重复的子树 题解 java实现给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。示例 1:因此,你需要以列表的形式返回上述重复子树的根结点。思路找到以当前节点的树结构,然后存入HashMap里面,顺便记录出现次数,当出现次数为1次的时候加入结果,找到当前根节点的树结构用后序遍历class Solution { List<TreeNode>原创 2021-02-09 16:53:31 · 446 阅读 · 6 评论 -
力扣 105. 从前序与中序遍历序列构造二叉树 题解
力扣 105. 从前序与中序遍历序列构造二叉树 题解根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:二叉树结构public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} T原创 2021-02-07 01:32:47 · 593 阅读 · 0 评论 -
最大二叉树
最大二叉树给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:二叉树的根是数组 nums 中的最大元素。左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。返回有给定数组 nums 构建的 最大二叉树 。示例 1:示例 2:输入:nums = [3,2,1]输出:[3,null,2,null,1]提示:1 <= nums.length <= 10原创 2021-02-06 16:55:49 · 340 阅读 · 0 评论 -
二叉树展开为链表
二叉树展开为链表给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。输入:root = [1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,null,5,null,6]示例 2:输入:root = []输出:[]示例 3:输入:root = [0]输出:原创 2021-02-04 22:18:05 · 189 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针
填充每个节点的下一个右侧节点指针给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。...原创 2021-02-04 01:15:35 · 149 阅读 · 2 评论 -
翻转二叉树
翻转二叉树翻转一棵二叉树。解法:二叉树的前序遍历class Solution { public TreeNode invertTree(TreeNode root) { if(root == null) return null; //交换左右节点 TreeNode temp = root.left; root.left = root.right; root.right = temp; inve原创 2021-02-04 00:34:54 · 127 阅读 · 0 评论 -
子集
力扣78题子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]提示:1 <= nums.length <= 10-10 <= nums[i] <= 10num原创 2021-02-03 17:59:25 · 151 阅读 · 3 评论 -
回文链表
回文链表ListNode结构如下 public static class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } }方式一:栈原创 2021-02-02 00:15:28 · 128 阅读 · 0 评论 -
最长回文子序列
最长回文子序列原创 2021-02-01 22:39:19 · 121 阅读 · 0 评论 -
最长回文子串
最长回文子串原创 2021-02-01 22:27:04 · 117 阅读 · 0 评论 -
K 个一组翻转链表
K 个一组翻转链表ListNode结构如下 public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }原创 2021-01-31 15:26:36 · 118 阅读 · 0 评论 -
反转链表 II
反转链表的一部分ListNode结构如下 public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }解法如下:class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if (head == null || head原创 2021-01-31 15:23:42 · 117 阅读 · 0 评论 -
反转链表前N个节点
反转链表前N个节点,并返回反转后的链表ListNode结构如下 public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }class Solution { //后继节点 ListNode successor = null; public ListNode reverseN(ListNode head, int n){原创 2021-01-31 15:21:30 · 770 阅读 · 1 评论 -
反转链表
反转链表ListNode结构如下 public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }方式一:非递归用next指针存下一个地址,用pre存反转后的链表,每次把当前值插入到最前面,头插法class Solution { public ListNode reverseList(ListNode head) {原创 2021-01-31 15:00:01 · 108 阅读 · 0 评论 -
四数之和
四数之和方式一:暴力法class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> res = new ArrayList<>(); for(int a=0; a<nums.length; a++){ for(int b=a+1; b<原创 2021-01-30 20:28:12 · 113 阅读 · 0 评论 -
三数之和
方式一:暴力法,超时class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res = new ArrayList<>(); for(int i=0; i<nums.length; i++){ for (int j=i+1; j<nums.length..原创 2021-01-29 21:43:35 · 108 阅读 · 0 评论 -
两数之和
方式一:暴力法,两个循环,枚举值找到结束循环class Solution { public static int[] twoSum(int[] nums, int target) { int[] res = new int[2]; for (int i=0; i<nums.length; i++){ for (int j=i+1; j<nums.length; j++){ int sum = n..原创 2021-01-29 18:32:32 · 142 阅读 · 0 评论