
算法
houjibofa2050
读源码,要有技术深度,做一个把一招练一万遍的程序员。
展开
-
leetcode 155. Min Stack 最小栈
https://www.cnblogs.com/lightwindy/p/8512214.html原创 2019-07-24 18:04:49 · 143 阅读 · 0 评论 -
优先级队列(java版)
poll 方法 删除堆顶的元素,把最后一个元素放在堆顶,调整堆结构。父节点是i,左子节点是2*1+1,右子节点是2*i+2。insert 方法 新增节点,从下往上调整堆结构。如果子节点是i,父节点是(i-1)/2。peek方法 获得堆顶的的元素。原创 2023-04-06 20:53:51 · 543 阅读 · 0 评论 -
动态规划之钢条切割问题(java)
问题分解:将长度为n的钢条分解为左边一段和剩余部分,左边一段不再进行分割,剩余部分继续分割(子问题相同,递归处理)给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,...n),求切割方案,使得销售收入r()最大。使用path[] 记录分割点位置 while循环输出分割点。复杂度 : 时间复杂度 O(n^2) 空间复杂度O(n)4.3 自顶向下的递归实现。4.2 自底向上迭代实现。4.3 输出切割方案。原创 2023-04-04 20:37:50 · 583 阅读 · 0 评论 -
如何实现LFU缓存(最近最少频率使用)
LFU缓存是一个具有指定大小的缓存,随着添加元素的增加,达到容量的上限,会最先移除最少使用频率的值。如果最少使用频率的值有多个,按照插入的先后顺序移除。要求put/get操作的时间复杂度O(1)原创 2023-02-11 08:33:55 · 815 阅读 · 0 评论 -
LRU 缓存实现
LRU缓存的设计思想: 在有限的空间下,如何访问和更新其中的元素.LRU缓存的设计原则: 如果一个数据在一段时间内没有被访问,以后这个数据被访问到的可能性也非常小,当访问的空间满时,删除最久的没有访问过的数据.使用hashmap加双向链表import sun.applet.Main;import java.util.HashMap;import java.util.Map;...原创 2019-02-12 16:31:29 · 651 阅读 · 1 评论 -
公平洗牌算法--Knuth 洗牌算法
公平洗牌算法--Knuth 洗牌算法原创 2023-01-16 00:23:59 · 649 阅读 · 0 评论 -
数独游戏底层算法
数独游戏底层算法原创 2022-12-04 16:59:25 · 418 阅读 · 0 评论 -
深度理解梯度提升树GBDT
1.什么是提升树 提升树是使用残差使损失函数最小,每一次使用树模型拟合残差。最终预测值y是M个树模型的累加和提升树模型如下提升树通用算法过程如下:2.什么是GBDT? GBDT是一种提升树模型,基学习器采用决策树,使用boosting思想+一阶梯度下降的方法。GBDT公式模型 GBDT=决策树+boosting思想+一阶梯度下降(gradient) boosting思想是基模型是有序的,上一个基模型的输出是下一个及模型的输入。第M个树模型...原创 2022-04-13 21:49:23 · 1924 阅读 · 0 评论 -
中国余数定理
1.什么是中国余数定理及其应用?中国余数定理也叫孙子定理,解决的是一元同余方程组问题。参考1.https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E5%89%A9%E4%BD%99%E5%AE%9A%E7%90%862.原创 2022-03-24 09:11:04 · 1851 阅读 · 0 评论 -
Boyer-Moore 投票算法及其应用
1.什么是Boyer-Moore 投票算法,BM算法的应用在什么地方? BM算法包括两个阶段,第一个阶段是投票阶段,第二个阶段是计数阶段 投票阶段是从第一个数候选值开始,相同则c+=1,不同则c-=1,如果c为0,则替换候选值为新的候选值。 统计阶段是对候选值进行验证,判断候选值是否符合条件,因为不是所有的候选值都符合条件。 主要的应用场景:求解众数,寻找超过n/3的所有的数2.具体案例 1.求解众数 要求时间复杂...原创 2021-09-26 09:15:47 · 338 阅读 · 0 评论 -
双向循环链表及其实现
1.什么是双向循环链表? 双向循环链表结构是两个指针,一个头指针(指向链表的头部),一个尾指针(指向链表的尾部),当前循环链表的长度size. 每个节点LinedNode由一个前向的指针,一个后向的指针,一个当前节点的值。2.双向循环链表的具体实现方法有哪些? int get(int index) 获得指定的元素 intaddAtHead(int val) 头结点新增元素 intaddAtTail(int val)尾节点新增元素...原创 2021-09-25 23:59:33 · 412 阅读 · 0 评论 -
数组算法专题
常见思想1.数组原地替换---把数字i放在数组索引i的位置,比如0放在arr[0]的位置,1放在arr[1]的位置☆☆☆☆☆题目1.无序数组包含正数,负数和0,计算数组中从0开始缺失的自然数,要求时间复杂度O(n),空间复杂度O(1) 比如:[1,2,3,-6.0] 输出:4 [-3,1,2,3,8] 输出:0代码如下//无序数组 正数 负数 0 //寻找从0开始缺失的自然数 //[-3,2,3,5] 0 //[-3,0,3,5] 1...原创 2021-09-24 19:54:27 · 155 阅读 · 0 评论 -
图论相关问题
1.图表示相关的数据结构有哪些? 1.邻接表 2.邻接矩阵2.图相关的问题有哪些? 1.拓扑排序 2.最小生成树 3.最短路劲3.什么是拓扑排序,拓扑排序的流程是什么?拓扑排序有什么用1.拓扑排序是序列中,对于任意的两点都存在一条路径且在的前面。 2拓扑排序的流程:三步核心(不断寻找入度为0的点)1.找到图中所有入度为0的点,加入队列2.把入度为0的点从队列...原创 2021-09-23 21:40:21 · 484 阅读 · 0 评论 -
leetcode 二叉树中和为某一值的路径
1.题目:二叉树中和为某一值的路径力扣2.解决方案递归+回溯代码如下 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } .原创 2021-09-22 16:58:26 · 208 阅读 · 0 评论 -
红黑树实现
1.什么是红黑树 红黑树是一颗二叉搜索树(左子树的元素都小于根节点,右子树的元素都大于根节点),每条路径下的黑色节点个数相同(黑高),即红黑平衡性。2.红黑树的性质有哪些? 1.根节点是黑色节点 2.最下层的叶子节点是黑色节点,包含NIL节点 3.每个节点节点只可能是两种颜色:红色或者黑色 4.不能出现红色节点与红色节点相连。 5.每一条路径上黑色的节点个数相同即红黑平衡性。3.红黑树中的基本...原创 2021-09-18 10:59:22 · 291 阅读 · 0 评论 -
线段树原理与应用
目录1.什么是线段树?线段树解决什么样的问题?2.线段树的怎么构造?3.线段树完整代码4.线段树案例1.什么是线段树?线段树解决什么样的问题? 线段树是一种二叉树,数据存储的指定范围的和,最大值,最小值,最大公约数,最小公倍数的树。它可以实现范围查找,范围新增,范围修改,时间复杂度O(log(n))2.线段树的怎么构造? 使用数组构造线段树,递归构造,从节点1开始,父节点与子节点的关系,参考堆排序,父节点编号是i,左节点编号是2*i,右节点...原创 2021-09-12 23:07:47 · 210 阅读 · 0 评论 -
manacher算法
1.manacher算法解决什么样的问题? manacher算法解决最长回文串的时间复杂度O(n)2.manacher算法的思路是什么? 11原创 2021-09-11 23:28:59 · 160 阅读 · 0 评论 -
最长上升子序列与最长上升递增序列解题思路
1.最长上升递增子序列 题目:674. 最长连续递增序列 方法:动态规划 定义dp数组 dp[i]是以i结尾的最长递增子序列 dp[0]=1 dp[i]=dp[i-1]+1 arr[i]>arr[i-1] dp[i]=1 arr[i]<arr[i-1] num=max(dp[i]) 0<=i<=n 时间复杂度O(n) 空间复...原创 2021-09-11 23:08:35 · 202 阅读 · 0 评论 -
循环链表及其应用
1.什么是循环链表?循环链表与单链表的区别? 循环链表是首尾相接的链表,普通链表是尾指针为空。2.循环链表的应用有哪些? 约瑟夫环,报数游戏,现在k个人,1,2,3...n报数 比如每次报2的出圈,然后重新报数。 解决方案: 方案1 标记+报数 数组模拟 方案2 基础结构使用循环链表代码如下public static void main(String[] args) { ...原创 2021-08-09 19:36:42 · 1358 阅读 · 0 评论 -
各种算法求解top k
import java.util.Arrays;import java.util.PriorityQueue;import java.util.Queue;/** * @Description: * topk的解决思路 最大值 * 1.全局排序 时间复杂度 O(nlogn) * 2.局部排序 冒泡排序 时间复杂度O(nk) * 3.最小堆 时间复杂福 O(nlog(k)) * 4.快排的变形随机选择 时间复杂度O(n)---- 证明见算法导论 * 5.top2 可以使用两个int.原创 2021-07-09 02:20:31 · 170 阅读 · 0 评论 -
自己手写一个BloomFilter
1.什么是BloomFilter 布隆过滤器 布隆过滤器用于判断一个元素是否在一个集合中,它有一定的误判率,不存在的元素,一定不存在。存在的不一定真的存在,它使用的是数组,它的空间效率是一般算法的1/8左右2.BloomFilter 的核心思想是什么? 布隆过滤器的核心思想: add 操作: 计算k个hash函数的值,把对应的结果映射到位数组上,将相应的位数组上的值值为1 contain 操作: 计算k个hash函数的值,判断k个所有的值是否都为1,如果都为...原创 2020-05-30 23:08:29 · 243 阅读 · 0 评论 -
leetcode 695. 岛屿的最大面积
解题思路:递归+沉岛思想当前元素是1,如果是第一次遇到,把当前元素置为0,保证下次递归的时候不被访问。类比leetcode 200,解题思路相同 public static void main(String[] args) { int[][] grid = {{0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},原创 2020-05-25 14:13:10 · 147 阅读 · 0 评论 -
复原IP地址
解题思路:递归加回溯 private static List<String> list = new ArrayList<>(); public static void main(String[] args) {// String s = "25525511135"; String s="010010"; restoreIpAddresses(s); System.out.println(list);原创 2020-05-22 17:26:37 · 277 阅读 · 0 评论 -
leetcode 152. 乘积最大子序列
解题思路:动态规划使用滚动数组,减少数组的开辟的空间dp[i][0]: 数组下表从0到i 使用nums[i]的乘积最大的值dp[i][1]: 数组下表从0到i 使用nums[i]的乘积最小的值为什么使用最大值和最小值?答: 因为当前元素可能为正也可能为负,如果为正,使用最大值,如果为负,使用最小值。 int x=i%2; int y=(i-1)%2; ar...原创 2020-02-04 09:18:24 · 254 阅读 · 0 评论 -
大数运算
leetcode415. 字符串相加StringBuilder sb = new StringBuilder(); int carry = 0; /** i >= 0 || j >= 0 只要有一个城里就继续,不成立的地方默认为0 继续进行加法 */ for (int i = num1.length() - 1, j = num2.length() - 1; i >= 0 || j >= 0; i--, j--) { .原创 2020-05-21 00:13:43 · 193 阅读 · 0 评论 -
面试题38. 字符串的排列
字符串的全排雷,其中字符串中包含重复的元素使用递归+回溯 public static void main(String[] args) {// String str="abc"; String str="aac"; String[] permutation = permutation(str); System.out.println(permutation); } public static String[] per原创 2020-05-18 12:45:24 · 190 阅读 · 0 评论 -
leetcode 679. 24 点游戏
解题思路:回溯算法1.首先从A集合中任意取两个数,对取出的两个数进行四则运算,将结果加到集合中。则原问题由4个数的问题转化为3个数,分而治之策略,递归解决,每次递归到底层,然后进行回溯。public class Test26 { public static void main(String[] args) { int[] nums={5,5,5,1}; ...原创 2020-05-05 22:45:10 · 221 阅读 · 0 评论 -
跳表性质及其实现
java 跳表的实现1.什么是跳表跳表是链表+多级索引 查找,新增,删除时间复杂度O(n)2.跳表的性质跳表的性质:1.有很多层组成2.每一层都是一个有序的链表3.最底层的链表包含所有的元素4.元素出现在level i层,元素在level i+1层也必然出现5.Node 节点包含两个元素,一个指向同一层的下一个元素,一个指向下面一层的元素3.跳表的...原创 2020-05-05 16:06:49 · 403 阅读 · 0 评论 -
并查集
并差集(union & find)是一种树形结构的数据结构,用于处理一些不交集(Disjoint Sets)的合并和查询问题.find: 确定元素属于哪一个子集,它可以被用来判断确定两个元素是否是属于同一个子集union: 将两个子集合并成同一个集合。实现方式:使用一个一维数组,一个find 方法查找属于哪个集合,一个union 合并两个子集代码实现:package c...原创 2020-02-06 23:09:57 · 129 阅读 · 0 评论 -
二分查找应用-计算开平方根
计算根号2有两种方法1.二分查找2.牛顿法public static void main(String[] args) { double sqrNum = getSqrNum(2); System.out.println(sqrNum); double sqrNum2 = getSqrNum2(2); System.out.println(sqrNum2); }...原创 2018-12-13 10:41:35 · 2423 阅读 · 0 评论 -
35. 搜索插入位置
解题思路:二分查找的变形array[mid]== target 返回 midarray[mid]<target 且 (array[mid+1]>target || mid== array.length-1) 返回mid+1array[mid]>target 且 (array[mid-1]<target || mid==0) 返回 mid代码:...原创 2019-09-03 16:21:32 · 86 阅读 · 0 评论 -
二分查找递归与循环实现
代码public static void main(String[] args) { int[] A={-1,2,5,20,90,100,207,800}; int[] B={2,200}; for (int num : B) {// boolean flag = binarySerach(A, num); ...原创 2019-09-03 15:40:10 · 269 阅读 · 0 评论 -
滚动数组
滚动数组 以斐波那契数列为例滚动数组多用于动态规划或递归中,多用于优化空间复杂度.动态规划是一个自底向上的过程,常常需要用到的是连续接,前面的解可以替换./** * 斐波那契数列 使用动态规划 dp[i]=dp[i-1]+dp[i-2] */ public static void test01(){ int[] arr=new int[...原创 2019-02-27 13:59:45 · 391 阅读 · 0 评论 -
顺序统计、中值 计算中位数---随机选择算法
random-partitionhttp://open.163.com/movie/2010/12/J/J/M6UTT5U0I_M756SE0JJ.html随机选择算法获得第i小的中位数代码:public static void main(String[] args) { //[1, 5, 9, 12, 15, 16, 30, 45, 23, 20] ...原创 2019-02-26 12:18:45 · 1390 阅读 · 0 评论 -
无界的优先队列 PriorityQueue
无界的优先队列 PriorityQueuedemo测试: public static void main(String[] args) { Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() { @Override ...原创 2019-02-25 16:51:58 · 181 阅读 · 0 评论 -
hashmap hashtable concurrenthashmap的区别与联系
为什么hashmap是不安全的.hashmap 在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。...原创 2019-02-22 16:24:14 · 355 阅读 · 0 评论 -
滑动窗口的思想
求一个字符串不重复的子串的最大的长度例如:abcabcbb, the answer is"abc", which the length is 3.滑动窗口是处理字符串和数组的经典方法,时间复杂度O(n)滑动窗口的思想:滑动窗口在字符串上从左到右滑动,一直到字符串的尾部,滑动窗口的长度是动态变化的,需要两个指针指向窗口的两边,指针i指向窗口的左边界,指针j指向窗口的右边界.1....原创 2019-02-20 21:29:03 · 1429 阅读 · 0 评论 -
2-3树
https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484676&idx=1&sn=95da6d2ab65302da195a75bc3122ea3b&chksm=fa0e6a85cd79e3936b6280a3f946dfd50fde3e46cfccd68f8dff2568d6dbb9c0e4b185f...原创 2019-02-14 16:52:19 · 96 阅读 · 0 评论 -
计算一个数的幂--时间复杂度O(logN)
计算一个数的幂--时间复杂度O(logN)解题思路:把数字n转化为二进制数,从右向左扫描,如果是1,进行累乘,每次移位num*=num;public static void main(String[] args) { int base=2; int n=10; int bitNum = getBitNum(base, n); System.out.println(bi...原创 2018-12-29 02:43:09 · 2181 阅读 · 0 评论 -
斐波那契数列 时间复杂度O(n) 空间复杂度O(1)
斐波那契数列解题思路:定义三个变量a,b,temp 更新变量a,b public static void main(String[] args) { for(int i=2;i<10;i++){ int num = getNum(i); System.out.print(num+" "); }...原创 2018-12-28 20:15:53 · 2198 阅读 · 0 评论