算法
Chenchen-
展望天空
展开
-
算法图解-读书总结
这本书百分之90的算法我其实都会,所以很快50分钟就看完了,非常推荐给刚学算法和数据结构的同学,每个涉猎都不深,但是广度是很有的,从排序 数据结构,到求最优算法 常用的一些算法,基本上都很干货,并且将的非常通俗易懂,有图。收获就是HLL 算法了,之前没接触过这个算法,在统计出现个数并且不要求完全正确的情况下还是蛮有用的,非常节省空间,附上看的两个博客,突然觉得redis 涉猎的东西真广。原创 2022-09-16 14:26:21 · 164 阅读 · 0 评论 -
leetcode canJump55
【代码】leetcode canJump55。原创 2022-09-02 09:46:16 · 110 阅读 · 0 评论 -
leetcode 接雨水
【代码】leetcode 接雨水。原创 2022-08-27 16:15:24 · 888 阅读 · 0 评论 -
863. All Nodes Distance K in Binary Tree
Loading...思路:先找到父,然后做类似爆炸的寻找,看成图去找思路2还没写:1 用O(n)把树打成数组 ,转换过程中如果找到target 就记录数组下标 2 根据当前target 进行运算 找 父节点 左右叶子节点,带入k 当k为0 说明算出一个解 3 循环get解-也就是数组下标,不为空就是有解/** * Definition for a binary tree node. * public class TreeNode { * int val; * Tr...原创 2022-04-19 23:06:53 · 265 阅读 · 0 评论 -
题:二叉树的最近公共祖先
力扣//解1public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // LCA 问题 if (root == null) { return root; } if (root == p || root == q) { return root; } TreeN原创 2022-04-14 16:47:24 · 435 阅读 · 0 评论 -
搜索二维矩阵 II
力扣代码package 算法;public class test { public static void main(String[] args) { int[][] matrix = new int[][]{{1,4,7,11,15}, {2,5,8,12,19}, {3,6,9,16,22}, {10,13,14,17,24}, {18,21,23,26,30}}; boolea原创 2022-04-11 11:01:57 · 139 阅读 · 0 评论 -
128. 最长连续序列
题目链接力扣class Solution { public int longestConsecutive(int[] nums) { if(nums.length==0){ return 0; } if(nums.length==1){ return 1; } //放到map里 Set<Integer> set = new HashSet<.原创 2022-03-25 18:47:25 · 640 阅读 · 1 评论 -
368. 最大整除子集 动态规划
原题:力扣思路:动态规划+记忆化搜索灵感:代码:package 算法.动态规划.leetcode;import java.util.*;/** * 并查集 */public class leetcode368 { public static void main(String[] args) { int[] nums = {1,2,3,4,6,12,24}; List<Integer> list = largestDi.原创 2022-03-09 23:08:29 · 101 阅读 · 0 评论 -
联想词匹配-总结
思考:经过一段时间的学习,对联想词匹配,和前缀树又有了更深刻的认识,也自己写了下,下面就详细说下构建过程与查询过程。整体算法图:介绍:DataSource 是数据接口,DataSourceImpl是数据接口的实现,主要用于提供联想词数据来源,持久化,恢复等功能。QueryInfo 记录每个词出现搜索次数,唯一编号,还有热度,主要到时候用于查找后,根据搜索次数热度等数据,进行排名,取前N个DataNode 根据DataSource...原创 2022-03-04 16:05:06 · 727 阅读 · 0 评论 -
打怪兽-动态规划-笔记
题目: 给定三个参数 N M K 怪兽有N滴血,坐等英雄来砍 英雄打一次怪兽,都会让怪兽算是0-M的血量 求K词打击后,英雄吧怪兽砍死概率代码package class22;public class Code01_KillMonster { public static double right(int N, int M, int K) { if (N < 1 || M < 1 || K < 1) ...原创 2022-02-27 16:25:36 · 390 阅读 · 0 评论 -
双数组Trie树(DoubleArrayTrie)Java实现-下
前言:这代码写的我都快郁闷死了,构建逻辑是清楚的,但是落实在代码上就有很多边界问题和取上一个的问题,本来还想再优化一下,但是又想了下,先出一版代码吧。。。前言2:这版代码我只测了a到z的字符,其他的没测(因为字符串要按char排序),也不支持数组扩展,如果太多的词就会有越界问题,不过这不影响本身的算法,重要的在于如何将前缀树构建到一个二维数组中,实现字符串匹配。构建词列表要求: 词列表: ab abc ...原创 2022-02-16 18:38:14 · 404 阅读 · 0 评论 -
递归练习-无中间变量翻转栈
要求:对一个栈进行逆序,不使用中间变量思路:每次取栈底元素,经过拿出来放进去的递归,就翻转了。代码:package 算法.递归练习题;import java.util.Stack;/** * 翻转栈,不用中间存储空间 */public class ReverseStackUsingRecursive { public static void main(String[] args) { //创建一个栈 Stack<Integer>原创 2021-12-14 14:04:54 · 113 阅读 · 0 评论 -
图-拓扑排序
认识:一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity)。在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的开始是以它的所有前序子工程的结束为先决条件的,但有些子工程没有先决条件,可以安排在任何时间开始。通常,我们把这种顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。AOV网的特点:无向无环图,因为如果有环就会有循环依赖,不符合项目...原创 2021-12-09 16:44:56 · 301 阅读 · 0 评论 -
数据结构-图-认识
什么是图? 思绪:还记的第一次接触这个数据结构的时候是很多年前,书本上考题,要写出拓扑顺序,选最优路径什么的,那时候还是用大脑来‘运算’这些问题,而现在我却用电脑代码来实现当初的问题,来解决更复杂的问题,每当学一个东西我都会想,这个东西有啥用,还记得当年第一次看图这个数据结构,我立马就想到了网络拓扑图路由路径之类,我想那应该就是图的应用场景,而现在我知道了图的更多应用场景,读完本篇文章,你会知道,图可以解决那些问题,图的全量数据结构(减掉一些也可以完成要解决的问题,看场景),如何把其他图的...原创 2021-12-09 14:58:01 · 1434 阅读 · 0 评论 -
力扣 200. 岛屿数量
题:给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/number-of-islands著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思考:记得小时候一到夏天就有很多杨树毛,打火机一烧就是一片,那假设有一块.原创 2021-12-08 18:13:20 · 192 阅读 · 0 评论 -
力扣 547. 省份数量-并查集解法
地址:力扣题目:有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。思路: 并查集解决思...原创 2021-12-08 13:41:59 · 373 阅读 · 0 评论 -
手写二分查找
package 算法.二分查找;public class Test { public static void main(String[] args) { int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10}; System.out.println(find(arr,0,arr.length,4)); } public static int find(int[] arr ,int l, int r ,int nu.原创 2021-12-07 21:00:19 · 415 阅读 · 0 评论 -
单链表翻转
package 算法.翻转链表;public class test { public static void main(String[] args) { //创建链表 Node N1 = new Node(1); Node N2 = new Node(2); Node N3 = new Node(3); Node N4 = new Node(4); N1.next = N2; .原创 2021-12-03 17:50:35 · 364 阅读 · 0 评论 -
JVM调优基本分析
调优方向:1 根据需求进行JVM规划和预调优2 优化JVM运行环境3 解决JVM运行过程中出现各种问题(OOM)调优概念:吞吐量=用户代码时间/(用户代码执行时间+垃圾回收时间)注释:主要看用户代码执行时间和垃圾回收的比,越大说明吞吐量越大在一定时间内执行更多的代码任务响应时间=STW越短,相应时间越好目标方案吞吐量优先:科学计算,数据挖掘,...原创 2021-11-28 22:26:03 · 163 阅读 · 0 评论 -
做项目求最大利润
题目:输入: 正数数组costs、正数数组profits、正数K、正数Mcosts[i]表示i号项目的花费profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润)K表示你只能串行的(挨个做)最多做k个项目M表示你初始的资金说明: 每做完一个项目,马上获得的收益,可以支持你去做下一个项目。不能并行的做项目。输出:你最后获得的最大钱数。思路:项目只能串行做项目,并且最大k个思路1:创建小根堆(花费)大根堆(利润)思路2 :放入小根堆后,把小于M原创 2021-11-24 21:18:41 · 184 阅读 · 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铜板。输入原创 2021-11-24 20:23:47 · 226 阅读 · 0 评论 -
会议室宣讲问题
题目:一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。给你每一个项目开始的时间和结束的时间你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。返回最多的宣讲场次。思路:会议数据:(1-5),(1-2),(2-8),(3-6),(3-11)1 按照结束时间排序2 先选结束时间最小的(例如 1-2)3 删掉因为选结束时间最小的那个会议,而导致不能选的会议(1-5)4 重复2和3步骤然后答案就是最优...原创 2021-11-24 19:54:05 · 134 阅读 · 0 评论 -
贪心算法介绍
是什么1)最自然智慧的算法2)用一种局部最功利的标准,总是做出在当前看来是最好的选择3)难点在于证明局部最功利的标准可以得到全局最优解4)对于贪心算法的学习主要以增加阅历和经验为主分析过程1,分析业务2,根据业务逻辑找到不同的贪心策略3,对于能举出反例的策略直接跳过,不能举出反例的策略要证明有效性这往往是特别困难的,要求数学能力很高且不具有统一的技巧性...原创 2021-11-24 19:50:36 · 86 阅读 · 0 评论 -
一张纸一直对折,按顺序打印
请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。 如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。给定一个输入参数N,代表纸条都从下边向上方连续对折N次。 请从上到下打印所有折痕的方向。例如:N=1时,打印: down N=2时,打印: down down up思路,首先是树结构,遍历中序遍历输出对折实验:可见左叶子节点都是凹,右边都是凸,所以我们中序.原创 2021-11-16 08:58:47 · 530 阅读 · 0 评论 -
给定一棵二叉树的头节点head,任何两个节点之间都存在距离,返回整棵二叉树的最大距离
题意:树节点之间距离为,节点A到B的节点数.思路:递归 每个节点 求出1 当前节点的最大距离2 当前节点高度这样到下一个节点的时候就有3中可能1 左节点最大距离最大2 有节点最大距离最大3 左节点高度+有节点高度+1 距离最大最后返回的节点就是最大距离Node: 1 当前节点高度 2 当前节点最大距离代码:package 算法.二叉树;public class test5 { /** * 树节点 ...原创 2021-11-16 08:31:23 · 502 阅读 · 0 评论 -
给定一棵二叉树的头节点head, 返回这颗二叉树中最大的二叉搜索子树的大小
题意: 在一棵二叉树中,有很多子树,判断是否是二叉搜索子树,二叉搜索树的大小是节点数累计合。思路: 1 判断当前的节点的左右节点是不是二叉搜索树,并且当前节点是不是,如果是说明能合并成一个大的二叉搜索树,左右节点相加再+1 2 如果左右节点任意一个不是二叉搜索树,说明当前节点也不是二叉搜索树,直接比左右节点大小,返回最大的Node: 1 当前节点中搜索二叉树最大节点数 2 当前节点是不是搜索二叉树 代码packag...原创 2021-11-15 19:52:43 · 284 阅读 · 0 评论 -
给定一棵二叉树的头节点head,返回这颗二叉树是不是满二叉树
什么是满二叉树性质:高度是h 节点数是 2 的h方-1个点思路:递归 返回高度 和节点数,最后返回结果 算下 看下满不满足Node节点 1 高度 2 节点数代码package 算法.二叉树;public class test3 { /** * 树节点 */ public static class Node { //1 当前节点总数 public int no...原创 2021-11-15 18:59:59 · 695 阅读 · 0 评论 -
给定一棵二叉树的头节点head,返回这颗二叉树是不是平衡二叉树
啥是平衡二叉树? 树的根节点,左右子树高度相差不超过1如何判断 1 当前节点的左右节点如果是平衡二叉树,并且两个节点高度相差不超过1 那么当前节点也是平衡二叉树 2 如果左右节点任意一个不是平衡二叉树,说明当前节点也不是平衡二叉树Node节点关键值: 1 当前节点是不是平衡二叉树 2 当前节点树的深度代码package 算法.二...原创 2021-11-15 18:30:07 · 607 阅读 · 0 评论 -
判断二叉树是否是搜索二叉树
什么是搜索二叉树 用来搜索的二叉树就叫搜索二叉树,用来对数据进行二分查找,特点就是1 所有左叶子节点的数都比当前节点小 2 所有右边节点的数都比当前节点大思路:判断当前节点的左右子树是不是二叉树,如果是,说明当前节点有可能是,判断当前节点是不是二叉树可能情况: 1 当前节点也是二叉查找树,条件就是左右子树是二叉查找树,并且当前节点的值大与左子树最大值,小于右子树最小值 2 当前...原创 2021-11-15 18:07:19 · 695 阅读 · 0 评论 -
二叉树-递归遍历-栈遍历(深度优先)-队列(广度优先)
前序:头左右中序:左头右后续:左右头代码package 算法;import java.util.Stack;public class 二叉树遍历 { /** * 树节点 */ public static class Node{ public Node left; public Node right; public String str; public Node(String...原创 2021-11-08 21:50:01 · 131 阅读 · 0 评论 -
手写布隆过滤器
是什么:判断某个数据是否在大数据量集合中,并且不占内存它可以告诉你某种东西一定不存在或者可能存在。能干什么:1 之前爬过100万个url ,判断url是否爬取过?2 有10亿个电话,判断某个号码是否在这10亿个中?4解决缓存穿透 把已经存在的key放到布隆过滤器里,如果用布隆过滤器查询没有就直接返回没有,如果有就是可能有,就算通过,能大大减少数据库并发原理: 有2个主要方法,放入和查...原创 2021-11-05 16:34:27 · 359 阅读 · 0 评论 -
各种排序算法总结
1)不基于比较的排序,对样本数据有严格要求,不易改写2)基于比较的排序,只要规定好两个样本怎么比大小就可以直接复用3)基于比较的排序,时间复杂度的极限是O(N*logN)4)时间复杂度O(N*logN)、额外空间复杂度低于O(N)、且稳定的基于比较的排序是不存在的。5)为了绝对的速度选快排、为了省空间选堆排、为了稳定性选归并,已经有序 需要新增选 插入 ...原创 2021-11-04 13:29:15 · 97 阅读 · 0 评论 -
判断两条单链表是否相交返回相交节点
题目:给两个链表,两个链表相交就返回相交的节点,如果不想交就为null给两个head节点需要时间复杂度O(n) 空间O(1)简单方案:容器的办法 HashSet 循环第一个链表的所有链 循环第二个链表如果判定在set里面就说明有交点两个链表相交情况图 不会有其他情况的! 单链表复杂方案: 1 先写一个函数1,可以判断单个链表是否有环快慢指针:1 快指针一次走2步 慢...原创 2021-11-04 13:25:59 · 231 阅读 · 0 评论 -
算法总目录
前言:排序算法,选最优算法等所有算法目录算法基础 评估算法的优劣指标-时间复杂度-空间复杂度-常数操作_我思故我在-CSDN博客 对数器:用于检验算法正确还是错误,主要分三分部分 1 生成算法所需数据 2 暴力或非最优的正确算法 3 算法结果比较器 最后循环多次验证,如果不对就报出来。 亦或运算亦或运算 ^_我思故我在-CSDN博客 位运算总结_我思故我在-CSDN博客位运算总结_我思故我在-C...原创 2021-11-01 14:33:23 · 399 阅读 · 0 评论 -
手写堆排序
堆是什么1 是完全二叉树2 分2中 大根堆和小根堆,大根堆 父节点永远比子节点大时间复杂度O(n*logn)思路:插入操作1 插入到堆的末尾2 比较父节点,大了向上走3 直到小于父节点或者到顶了停止输出(从大到小输出)1 输出最顶的数...原创 2021-11-01 14:32:05 · 405 阅读 · 0 评论 -
手写插入排序
1.3 插入排序 | 菜鸟教程package 算法;public class 插入排序 { public static void sort(int[] arr){ for (int i = 1; i < arr.length; i++) { for (int j = i; j >0 ; j--) { if (arr[j] < arr[j-1]) { swap(.原创 2021-10-31 14:48:45 · 92 阅读 · 0 评论 -
手写冒泡排序
思路:循环n次 每次 从头到尾 比较交换,就像冒泡一样= = ,每次循环尾巴都会有个当前最大数1.1 冒泡排序 | 菜鸟教程package 算法;public class 冒泡排序 { public static void sort(int[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length-1-i; j++) { .原创 2021-10-31 14:25:58 · 335 阅读 · 0 评论 -
手写桶排序-计数排序
什么是计数排序 形式上:循环int数组找出最大值,创建一个最大值为数组大小的数组,然后循环需要排序的数组,根据每个数,对应数组下标+1 ,最后循环数组,按照个数从小到大输出,就完成了排序。 思想上:我觉得任何可以转换成数字的都能进行计数排序,比较适合需要排序的东西重复性比较强的的并且容易转换的。 例如:有 红绿青蓝紫 五种球,需要在乱序的arr数组中将这几种球按照红绿青蓝紫 来排序输出,那我们只要循环一次数组,按照顺序对应数组下标,统计出每个球的个...原创 2021-10-30 20:52:39 · 135 阅读 · 0 评论 -
手写桶排序-基数排序
限制:非负数,能表达成10进制的数时间复杂度:O(N* log10max) max = 最大数的位数如果是2 进制就是log 2思路:1 有10个桶(几进制就有几个桶)2 有个一个数组arr,把所有数字按照个位数 大小放到1到10的桶里3 然后按照桶的顺序取出数字,这样数字就按照个位数大小排好了4 按照2和3的操作,再操作10位百位直到最高位代码思路 由定位器...原创 2021-10-30 00:13:46 · 328 阅读 · 0 评论 -
手写前缀树
前言: 还记得之前遇到过一些问题,比如一篇文章单词出现过多少次?一篇文章 每个单词前缀为**的出现几次? 一篇文章 ** 单词段出现过几次,看完前缀树都有了答案。思路 1 构建一棵树 需要记录每个节点的 pass 经过数量 end 单词末尾是这个字母的数量 2 node节点上 需要有个一 数组 26 大小 用于存放这个节点的叶子节点 3 添加单词的时候 需要对经过的节点pass +1 end +1 如果没有节点需要新建节点...原创 2021-10-29 17:49:38 · 157 阅读 · 0 评论