算法
永远在摸鱼的桃
这个作者很懒,什么都没留下…
展开
-
异或相关概念及习题
在Java中,异或运算是以二进制的形式进行计算的,当进行异或运算时,会先把两个数值转换成二进制,在进行异或运算。运算规则:在同位上的数值,相同则为0(都是0或者都是1),不同则为1(一个为0一个为1)运算定理:1、结合律:(ac=ac)2、交换律:aa3、与自身异或:a^a=04、与0异或:a^0=a。原创 2022-12-14 20:41:03 · 336 阅读 · 1 评论 -
动态规划习题(二)
0-1 背包问题 (暴力递归 / 动态规划)规定1和A对应、2和B对应、3和C对应…26和Z对应那么一个数字字符串比如"111”就可以转化为:“AAA”、“KA"和"AK”给定一个只有数字字符组成的字符串str,返回有多少种转化结果三、LeetCode 691. 贴纸拼词暴力递归暴力递归.........原创 2022-06-20 18:21:51 · 210 阅读 · 0 评论 -
0-1背包问题 (暴力递归 / 动态规划)
给定两个长度都为N的数组weights和values,weights[i]和values[i]分别代表 i号物品的重量和价值给定一个正数bag,表示一个载重bag的袋子,装的物品不能超过这个重量返回能装下的最大价值原创 2022-06-20 16:17:28 · 478 阅读 · 0 评论 -
动态规划习题(一)
假设有排成一行的N个位置记为1~N,N一定大于或等于2开始时机器人在其中的start位置上(start一定是1~N中的一个)如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到N-1位置;如果机器人来到中间位置,那么下一步可以往左走或者往右走;规定机器人必须走K步,最终能来到aim位置(P也是1~N中的一个)的方法有多少种给定四个参数 N,start,aim,K 返回能走到的方法数.........原创 2022-06-17 21:48:06 · 199 阅读 · 0 评论 -
逆序栈 (不申请额外的数据结构 / 递归)
逆序栈 递归原创 2022-06-10 21:31:16 · 120 阅读 · 0 评论 -
打印一个字符串的全排列 (递归)
字符串的全排列 递归原创 2022-06-10 20:52:09 · 217 阅读 · 0 评论 -
打印一个字符串的全部子序列 (递归)
字符串子序列 递归原创 2022-06-10 16:23:32 · 382 阅读 · 0 评论 -
汉诺塔问题 (递归)
汉诺塔递归原创 2022-06-10 11:35:37 · 157 阅读 · 0 评论 -
Dijkstra算法 (迪杰斯特拉算法) (图 / 最短路径 / 加强堆)
迪杰斯特拉算法是由荷兰计算机科学家在1956年发现的算法,此算法使用类似广度优先搜索的方法解决了带权图的单源最短路径问题。它是一个贪心算法。原创 2022-06-09 11:04:13 · 392 阅读 · 0 评论 -
prim算法 (普利姆算法) (图 / 最小生产树)
prim算法(普利姆算法):对图G(V,E)设置集合S,存放已访问的顶点,然后每次从集合V-S中选择与集合S的最短距离最小的一个顶点(记为u),访问并加入集合S。之后,令顶点u为中介点,优化所有从u能到达的顶点v与集合S之间的最短距离。执行n次(n为顶点个数),直到集合S已包含所有顶点。......原创 2022-06-09 10:10:31 · 260 阅读 · 0 评论 -
Kruskal算法(克鲁斯卡尔算法) (图/最小生成树) (并查集)
最小生产数讲解克鲁斯卡尔(Kruskal)算法从另一途径求网的最小生成树。其基本思想是:假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),概述图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止............原创 2022-06-09 08:55:14 · 367 阅读 · 0 评论 -
图的数据结构表示、遍历
图的结构化实例BFS 广度优先遍历DFS 深度优先遍历图的拓扑排序拓扑序列:一些活动,其中某些活动必须在另一些活动完成之后才能开始,一定是无环的有向图,称为AOV网。拓扑排序:其实就是对一个有向图构造拓扑序列的过程。构造时会有两个结果:如果此网的全部结点都被输出,则说明其为不存在环的AOV网。如果没有输出全部顶点数,则说明这个网存在回路,不是AOV网。拓扑排序基本思路:从AOV网中选择一个入度为0的顶点输出,然后删去此结点,并删除以此结点为尾的弧,继续重复此步骤,直到输出全部顶点或者AOV网原创 2022-06-07 18:28:33 · 220 阅读 · 0 评论 -
LeetCode 305. 岛屿数量 II (并查集)
LeetCode 305. 岛屿数量 II (并查集)原创 2022-06-06 10:22:46 · 179 阅读 · 0 评论 -
200. 岛屿数量 (递归 / 并查集)
并查集 岛屿数量原创 2022-06-06 09:12:48 · 205 阅读 · 0 评论 -
并查集的实现 及 相关题目
并查集的本质是通过一个一维数组来维护一个森林。开始时森林中的每一个节点都是孤立的,各自形成一个树。之后,进行若干次的合并操作,每次合并将两个树合并为一个更大的树。相关题目LeetCode 547. 省份数量...原创 2022-06-04 12:21:30 · 166 阅读 · 0 评论 -
路灯问题 (贪心算法)
给定一个字符串str,只由’X’和’.'两种字符构成‘X’表示墙,不能放灯,也不需要点亮;’.'表示居民点,可以放灯,需要点亮如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮返回如果点亮str中所有需要点亮的位置,至少需要几盏灯...原创 2022-06-03 21:51:08 · 608 阅读 · 0 评论 -
LeetCode 502. IPO (贪心算法)
IPO 贪心算法原创 2022-06-03 21:17:47 · 328 阅读 · 0 评论 -
分金问题 返回分割的最小代价 (贪心算法)
一块金条切成两半,是需要花费和长度数值一样的铜板比如长度为20的金条,不管怎么切都要花费20个铜板,一群人想整分整块金条,怎么分最省铜板?例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。如果先把长度60的金条分成10和50,花费60;再把长度50的金条分成20和30,花费50;一共花费110铜板但如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20,花费30;一共花费90铜板输入一个数组,返回分割的最小代价本原创 2022-06-03 20:37:49 · 449 阅读 · 0 评论 -
最多宣讲场次 (贪心算法)
一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲,给你每一个项目开始的时间和结束的时间你来安排宣讲的日程,要求会议室进行的宣讲的场次最多,返回最多的宣讲场次原创 2022-06-03 20:09:16 · 176 阅读 · 0 评论 -
拼接字符串,结果中字典序最小 (贪心算法)
给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果将字符序列排序,排序的规则就是,如果a拼b 小于 b拼a,就将a放到前面;然后遍历整个排好序的字符串直接拼接,就是贪心后的字典序最小的字符串...原创 2022-06-03 11:42:32 · 369 阅读 · 0 评论 -
派对的最大快乐值 (二叉树的递归套路)
员工信息的定义如下:公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树树的头节点是公司唯一的老板,除老板之外的每个员工都有唯一的直接上级叶节点是没有任何下属的基层员工(subordinates列表为空),除基层员工外每个员工都有一个或多个直接下级这个公司现在要办party,你可以决定哪些员工来,哪些员工不来,规则:’给定一棵多叉树的头节点boss,请返回派对的最大快乐值。只分两种所以根据二叉树的递归套路,我们需要获得的信息就是当前节点X来时的最原创 2022-06-03 10:02:02 · 253 阅读 · 0 评论 -
LeetCode 450. 删除二叉搜索树中的节点 (递归)
删除二叉搜索树中的节点原创 2022-06-02 11:40:35 · 143 阅读 · 0 评论 -
二叉树中最大二叉搜索子树的头结点 (二叉树的递归套路)
给定一颗二叉树的头结点head,返回这个二叉树中最大二叉搜索子树的头结点原创 2022-06-01 10:44:19 · 168 阅读 · 0 评论 -
二叉树的递归套路
二叉树的递归套路相关题目判断二叉树是不是满二叉树 LeetCode 543. 二叉树的直径最大的二叉搜索子树原创 2022-05-31 10:47:54 · 88 阅读 · 0 评论 -
最大的二叉搜索子树 (二叉树递归套路)
给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的大小思路若当前不以x为头,那么看:x的左树中最大二叉搜索子树的大小x的右树中最大二叉搜索子树的大小若当前节点为x为头,那么看经过x的树是不是二叉搜索树;3. x的左子树是不是二叉搜索树4. x的右子树是不是二叉搜索树5. 左树的max < x6. 右树的min > x7. 左树的大小 + 右树的大小 + 1,就是当前二叉搜索子树的大小代码实现public class Code05_MaxSubBSTS原创 2022-05-31 10:36:17 · 161 阅读 · 0 评论 -
判断二叉树是不是满二叉树 (二叉树的递归套路)
思路主要思路是:满二叉树的高度为h,那么它的节点数为2h-1所以按照二叉树递归套路,创建Info类,其中保存当前节点的高度和其下节点数代码实现public class Code04_IsFull { public static class Node { public int value; public Node left; public Node right; public Node(int data) { .原创 2022-05-31 09:48:49 · 314 阅读 · 0 评论 -
LeetCode 543. 二叉树的直径 (二叉树递归套路)
思路代码实现public class Code06_MaxDistance { public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; } } public static cla.原创 2022-05-29 13:40:21 · 1202 阅读 · 0 评论 -
判断二叉树是不是完全二叉树 (层序遍历 / 二叉树递归套路)
思路非递归:代码实现// 非递归public static boolean isCBT1(Node head) { if (head == null) { return true; } Queue<Node> queue = new LinkedList<>(); queue.add(head); // 叶子节点标志 boolean leaf = false; while (!queue.isEmpt.原创 2022-05-29 10:15:28 · 412 阅读 · 0 评论 -
LeetCode 1021. 删除最外层的括号 (栈 / 字符串)
思路这道题可以用栈来找出所有原语分解,然后对每个分解后的去除最左边和最右边的括号最后连在一起即可,但是这种复杂度较高。由于题中说了S一定是合法的,我们就可以用统计左括号的个数的方法直接过滤掉每个原语的最外层括号。代码实现// 时间复杂度较高class Solution { public String removeOuterParentheses(String s) { Stack<Character> stack = new Stack<>().原创 2022-05-28 09:11:13 · 196 阅读 · 0 评论 -
求二叉树某个节点的后继节点
求二叉树某个节点的后继节点二叉树结构如下定义:Class Node {V value;Node left;Node right;Node parent;}给你二叉树中的某个节点x,返回该节点的后继节点思路根据中序遍历找后继节点O(n)根据中序遍历的特性,中序序列中一个节点的下一个节点,就是该节点的后继节点首先根据给出的节点x,可以找到这个树的根节点;根据这个找到的根节点,可以写出这个树的中序遍历序列;在这个中序遍历序列中找x的下一个节点,就是x的后继节点根据题目给出二叉树结构来原创 2022-05-27 11:59:22 · 165 阅读 · 0 评论 -
求二叉树最宽的层有多少个节点 (层序遍历)
思路准备curEnd(表示当前层的结束节点)、nextEnd(表示下一层的结束节点)、curLevelNodes(表示当前层的宽度)、max(表示最大宽度)四个变量。curEnd修改为二叉树的头节点(其他均为默认值),头节点入队列。从队列中弹出一个节点,每出队一个节点则curLevelNodes加一,出队节点有左孩子则左孩子入队,有右孩子则右孩子入队,有节点入队则将nextEnd修改为当前入队的节点(为下一层查找做准备,就是找下层最右节点,作为一个标识)。判断第3步出队的节点是否等于curEnd。原创 2022-05-27 10:44:41 · 145 阅读 · 0 评论 -
LeetCode 431. 将N叉树编码为二叉树 (深度优先遍历)
思路代码实现(java)/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List<Node> _children) { .原创 2022-05-26 23:28:44 · 151 阅读 · 0 评论 -
二叉树前序、中序、后序遍历(递归、非递归)
递归package class10;public class Code02_RecursiveTraversalBT { public static class Node { public int value; public Node left; public Node right; public Node(int v) { value = v; } } // 先序打印所有节点 public static void pre(Node head) { if (原创 2022-05-26 21:48:34 · 104 阅读 · 0 评论 -
LeetCode 124. 二叉树中的最大路径和 (递归)
思路代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode r.原创 2022-05-26 00:11:51 · 215 阅读 · 0 评论 -
链表相关面试题
判断链表是否为回文结构给定一个单链表的头节点head,请判断该链表是否为回文结构思路1. 额外空间占用为O(n)的,使用额外空间2. 额外空间占用为O(1)的,不使用额外空间代码实现将链表按n划分成左边<n、中间==n、右边>n给定一个单链表的头节点head,给定一个整数n,将链表按n划分成左边<n、中间==n、右边>n思路1. 额外空间占用为O(n)的,使用额外空间2. 额外空间占用为O(1)的,不使用额外空间代码实现复制一个特殊结构的单链表一原创 2022-05-25 19:47:10 · 248 阅读 · 0 评论 -
LeetCode 965. 单值二叉树 (递归)
思路如果根节点为null,返回true。如果根节点值和左右子树值相同并且左右子树都是单值树返回true代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } .原创 2022-05-24 09:05:18 · 95 阅读 · 0 评论 -
LeetCode 464. 我能赢吗 (递归 / 位运算 / 博弈论)
思路首先判断特例:如果最大能选择的数字maxChoosableInteger比期望的总数desiredTotal要大,先手稳赢,返回True如果能选择的所有数字总和比期望的总数desiredTotal要小,一定到达不了desiredTotal,先手稳输,返回False用二进制位来标记某个数是否已被选择,比如01表示1已被选择,10表示2已被选择,11表示1和2都被选择,100表示3被选择,以此类推,1 << i 表示 i + 1已被选择n个数共有2n种被选择与否的状态.原创 2022-05-22 10:44:09 · 399 阅读 · 0 评论 -
计数排序 + 基数排序
计数排序统计给定一个集合中,每个数字出现的次数,然后根据次数,依次将对应数组按顺序放回但是计数排序有局限性,只能一次统计已知一定范围内的元素。如下列示例代码中,找到数组元素最大值,然后创建以最大值为大小的数组,作为桶进行技术,会造成空间浪费,也有一定局限性。代码实现 // only for 0~200 value public static void countSort(int[] arr) { if (arr == null || arr.length < 2) { retur原创 2022-05-20 13:12:48 · 142 阅读 · 0 评论 -
LeetCode 436. 寻找右区间 (排序 / 二分 / 哈希表)
思路TreeMap根据题目描述,注意几个地方,每个start[i]都不同,而且要求start[j]>=end[i],很容易联想到使用带排序的哈希结构,也就是TreeMap,具体实现为:第一次遍历 intervals,完成TreeMap的构造,key为左端点,value为index位置;第二次遍历 intervals,对每个interval的右端点取ceiling,如果不存在,即为-1,填充在结果集中;排序 + 二分为了方便,我们称 intervals 为 its。对于每个 its[.原创 2022-05-20 11:06:35 · 178 阅读 · 0 评论 -
前缀树讲解 -- LeetCode 208. 实现 Trie (前缀树)
思路每个节点都从root根节点开始遍历,如果经过某个节点,就将这个节点的pass++,如果一个字符串到达了末尾,就将这个节点的end++;循环遍历每个节点,就会创建出一颗前缀树代码实现(java)前缀树:public class TrieTree { public static class Node { public int pass; public int end; public Node[] nexts; public.原创 2022-05-19 22:49:57 · 250 阅读 · 0 评论