算法
文章平均质量分 90
算法就是解决问题的方法步骤
数据结构是实现算法的工具
外练框架,内修算法
猫哥灬01
话不在多,在于精
展开
-
数组和链表
插入排序动态获得中位数 public static int[] getMiddle(int[] A, int n) { // write code here int[]res=new int[A.length]; res[0]=A[0]; //插入排序, 每次取i/2的数 for (int i = 1; i...原创 2020-04-20 10:19:32 · 284 阅读 · 0 评论 -
排序算法思想与实现
场景:快速: 大量 无序 归并:大数据 外排序是否基本有序: 有 - > 归并 无 ->快速快速排序适合场景:无序,对稳定性没有要求时 特点:速度快,但是不稳定 核心思想 找到基准数,第一次以第一个元素为基准 从后往前比,比基准数小的,移到数组头部 从前往后比,比基准数大的,移到数组尾部 把基准数放入中间位置 publi......原创 2019-04-01 09:28:47 · 243 阅读 · 0 评论 -
二叉树经典题
https://blog.csdn.net/qq_37859539/article/details/81462171原创 2019-11-10 14:30:56 · 791 阅读 · 0 评论 -
动态规划&回溯各种变形题
叠罗汉叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。为了使叠成的罗汉更稳固,我们应该让上面的人比下面的人更轻一点。现在一个马戏团要表演这个节目,为了视觉效果,我们还要求下面的人的身高比上面的人高。请编写一个算法,计算最多能叠多少人,注意这里所有演员都同时出现。给定一个二维int的数组actors,每个元素有两个值,分别代表一个演员的身高和体重。同时给定演员总数n,请返回最多能........................原创 2019-12-15 20:36:55 · 709 阅读 · 0 评论 -
经典算法
动态规划的基本思想就是将待求解问题分解为若干子问题,(如本题中我们将dp[i][j]分解为若干dp[i-1][j-x]的问题),先求解这些子问题并将结果保存起来( 我们用dp[][]二维数组保存子结果),若在求解较大的问题时用到较小子问题的结果,可以直接取用(求dp[i][j]时用dp[i-1][x]的结果),从而免去重复计算池塘抽样算法1. 先将前k个作为结果2. 然后用后面的数随机...转载 2019-12-10 20:35:51 · 236 阅读 · 0 评论 -
LeedCode前200道算法思路记录
写算法一定要顺藤摸瓜, 先找到头, 然后顺着藤, 该基础操作(判断,循环), 该高级操作(递归, 回溯, 动规)1. 比如 最长回文字串 算法, 开始时思路是如果是回文, 保存一个长度和回文的map,最后根据最大长度返回对应的回文.解决:可以维护一个最大值变量, 每次如果大于max,则更新max, 同时更新对应的结果值, 小于则不更新 if (isPa...原创 2019-11-19 18:04:33 · 380 阅读 · 0 评论 -
缓存过期清除策略之LRU算法
class LRUCache{ Node head; Node end; int limit; HashMap<String, Node> map = new HashMap<>(); public LRUCache(int limit) { this.limit = limit; } public String get(String key) { Node node = map.ge.原创 2020-06-06 20:36:46 · 560 阅读 · 0 评论 -
每日收获(4月7日- 4月10日)
4月7日计算逆序对import java.util.*;public class AntiOrder { public int count(int[] A, int n) { // write code here if (A == null || n == 0) return 0; return mergeSortRecursio...原创 2020-04-07 09:44:05 · 127 阅读 · 0 评论 -
每日收获(3月30日-4月3日)
3月31日输出某一深度上所有的节点组成的链表//判断是否是指定深度, 如果不是则递归查询左右子树//如果是则追加到结果中ListNode res = new ListNode(-1);ListNode cur = res;public ListNode getTreeLevel(Node root, int depth) { if (root == null || dep...原创 2020-03-31 09:25:59 · 172 阅读 · 0 评论 -
数据结构基本实现
数组链表栈队列树图/** * 深度优先搜索(递归) */ private boolean checkDFS(UndirectedGraphNode a, UndirectedGraphNode b) { if (a == null || b == null) { return false; ...原创 2020-03-31 09:00:54 · 250 阅读 · 0 评论 -
每日收获(3月23日-3月27日)
3月23日回文判断就用栈, 首先找到中点.回文链表import java.util.*;/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Palindrom...原创 2020-03-23 09:10:00 · 215 阅读 · 0 评论 -
每日收获(3月17-3月20)
2020年3月17日StringBuilder的append方法可以追加任何基本类型3月18日单链表 包含 数据 和 next指针 头节点不包含数据 链表插入 先定位到要插入的节点的前一个元素 修改前节点的next 修改插入节点的next 定位函数定位到当前index对应的节点 int i = 0; cur = h...原创 2020-03-29 16:43:45 · 175 阅读 · 0 评论 -
读《计算机常用算法与程序设计》笔记
好的程序:可读性,可靠性,可扩展性程序复杂度时间复杂度定理1. m=1 f(n) = O(n)2. m=2 f(n) = O(n^2)3. n=2 f(n) = O(2^m);空间复杂度结构化编程常用算法思想穷举法例题:回溯法组合...原创 2020-02-28 09:33:38 · 251 阅读 · 0 评论 -
动态规划优质博客
https://blog.csdn.net/baidu_28312631/article/details/47418773动态规划解题思路:1. 确定dp数组2. 临界点赋值3. 确定递推方程.举例: 打家劫舍输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = ...转载 2019-11-21 14:55:49 · 170 阅读 · 0 评论 -
时间复杂度计算
https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82976039转载 2019-11-20 10:29:48 · 145 阅读 · 0 评论 -
经典的递归算法题
1. 斐波那切 (爬楼梯)class Solution { HashMap<Integer,Integer> cache = new HashMap<>(); public int fib(int N) { if (cache.containsKey(N)) { return cache.get(N);...原创 2019-10-27 17:58:15 · 3894 阅读 · 0 评论 -
算法工具
递归回溯哈希表前缀树快慢指针二分原创 2019-10-12 09:15:25 · 419 阅读 · 0 评论 -
一篇打尽回文算法
数字回文class Solution { public boolean isPalindrome(int x) { //思考:这里大家可以思考一下,为什么末尾为 0 就可以直接返回 false if (x < 0 || (x % 10 == 0 && x != 0)) return false; int rever...原创 2019-10-11 21:36:20 · 1391 阅读 · 1 评论 -
五大基本算法之 基础算法实现
大致套路求总共多少 - 用分治法求最大 - 用动态规划求是否存在 - 用二分(先排序)数组和字符串 - 大部分可以用双指针法哈希可以降低时间复杂度对数字的操作就是 n % 10 n/10数字判断回文,反转后和原来相等二分查找public int binarySearch(int[] a, int l,int r, int k){ while(l &l...原创 2019-08-01 09:13:11 · 592 阅读 · 0 评论 -
五大基本算法思想之分治法
What分治法是将一个难以直接解决的大问题,分割成一些规模较小的相同问题,小问题解决,大问题随之解决。分治法在每一层递归上都有三个步骤: step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题 step3 合并:将各个子问题的解合并为原问题的解。经典例题全...原创 2019-07-20 20:16:42 · 559 阅读 · 0 评论 -
LeedCode 巧妙思想记录
生成不重复的随机数int startArray[] = {0,1,2,3,4,5,6,7,8,9};//seed array int N = 10;//随机数个数 int resultArray[] = new int [10];//结果存放在里面 Random random = new Random(); for(int i ...原创 2019-07-19 08:52:59 · 160 阅读 · 0 评论 -
五大基本算法思想之动态规划和贪心算法
使用场景: 一个大问题可以拆分成多个小问题,每个小问题有最优解(最值) ,则大问题有最优解。把一根绳子剪成多段,并且使得每段的长度乘积最大。我们先考虑能否把大问题分解成小问题,分解后的小问题也存在最优解,如果把小问题的最优解组合起来能否是整个问题的最优解,这就是动态规划求解贪心算法注意是找合适的值(本例中的3和2) 并用数学归纳法证明。public class JianSheng...原创 2019-07-13 19:05:47 · 1535 阅读 · 0 评论 -
五大基本算法思想之递归回溯
使用场景: 求解所有可行方案。 整个过程有多个步骤,每个步骤有多个选择,从中选出可行方案八皇后在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法public class EightQueen{ public static int[][] arry=new int[8][8];//棋盘,放皇后 pub...原创 2019-07-13 15:48:56 · 442 阅读 · 0 评论 -
内功算法之思维套路
while 操作双指针 替换 双层for循环 题目:两个数组取交集 【1,2,3】 和 【2,3,4】 ==》 【2,3】第一想法就是通过双层for实现,但是时间复杂度为O(n*n)可以优化1. 排序Arrays.sort2. 比较private static List<Integer> intersect(int[] a, int[] b) { ...原创 2019-07-08 11:15:46 · 204 阅读 · 0 评论 -
六、内功算法之算法性能优化
3-SUM问题任给一堆数,从中任选3个,相加和为0.常规实现3个for循环public int count(int[] ids){ int count = 0; int length = ids.length; for (int i = 0; i < length; i++) { for (int j ...原创 2019-04-01 13:16:54 · 378 阅读 · 0 评论 -
五、内功算法之算法性能分析和预测
性能分析总的耗费时间就是访问内存的次数 重点观察for循环 该算法能否处理大型数据 时间复杂度最好达到nlogn以下预测幂定律 将输入数据成倍增加 观察每次的运行时间结果,从而数学建模,绘制几何图形,该直线的斜率a,则算法的时间复杂度为n^a.普林斯顿大学时间复杂度分类处理问题的规模...原创 2019-03-26 08:21:05 · 249 阅读 · 0 评论 -
四、内功算法之连通性问题路径压缩优化查询
问题:虽然不会生成很高得树,但是在查询时还是一步一步得查找根节点,这块还能优化思路:在查询根节点时,将当前得根节点设置为爷爷节点,从而下次在查询时,原查询路径缩短为一半,节点越多,效果越明显。代码实现package com.jd.testjava.algorithm;/** * 连通性问题 * 使用树结构实现 * 快速合并算法优化(将小树合并到大树下面,避免大树合并到小树,...原创 2019-03-25 10:54:57 · 242 阅读 · 0 评论 -
三、内功算法之连通性问题快速合并优化
问题:为避免生成很高得树,影响节点查询性能。处理:合并时,判断树高,将小树合并在大树下。代码实现package com.jd.testjava.algorithm;/** * 连通性问题 * 使用树结构实现 * 快速合并算法优化(将小树合并到大树下面,避免大树合并到小树,高度成倍增长) * 带权(高度)快速合并算法 * * @author lichenyang8 *...原创 2019-03-25 10:49:57 · 263 阅读 · 0 评论 -
二、内功算法之连通性问题快速合并实现
判断在一个网络中,两个点是否连通 数学建模 如何表示整个网络中的点? 如何表示两个点连通? 如何将给定的点连通? 数据结构选取 用树表示整个网络 两个点的根节点相同则为连通 将两个点的根节点改为一样则表示将两点连通 代码实现 package com.jd.testjava.algorithm;/** * 连通性问题 * 使用树结...原创 2019-03-25 10:47:51 · 188 阅读 · 0 评论 -
一、内功算法之连通性问题快速查找实现
判断在一个网络中,两个点是否连通 数学建模 如何表示整个网络中的点? 如何表示两个点连通? 如何将给定的点连通? 数据结构选取 用数组存储整个网络中的点 给每个点取值,并用数组下标和点值相对应 数组元素相等则表示两个点连通 将两个下标对应的元素修改为相同,则表示将给定的点连通 代码实现 /** * 连通性问题方法 */publ...原创 2019-03-24 13:11:37 · 200 阅读 · 0 评论