
算法
文章平均质量分 76
L__ear
我还只是个孩子呀
展开
-
笔试会遇到的树相关的算法
1. 构建哈夫曼树public class Huffman { static class Node{ int val; Node left, right; Node(int val){ this.val = val; } } // 看作是合并森林中的树 private static Node buildHuffman(int[] w) { Queue<Node> heap = new PriorityQueue<>((a, b)->(原创 2020-10-01 22:18:54 · 174 阅读 · 0 评论 -
前缀树笔记
1. 前言发现笔试题经常爱考前缀树。每次慢慢回忆,再慢悠悠的写代码,时间根本来不及。需要总结一下记忆方法,目标是以后碰到前缀树的题能上手就来。记忆点一:图记忆点二:边表示字符,结点对应 isEnd 和 count 信息。从结点到根只有一条路径,表示一个字符串前缀。记忆点三:class Trie { final int max = 1000; int[][] tree = new tree[max][26]; // 一行表示一个结点;孩子表示法 int[] count = new原创 2020-09-30 15:51:33 · 254 阅读 · 0 评论 -
算法题 牌型判断 Java
题目德州扑克的花型由 N 张扑克牌组成 0<N<8,可以组成的牌型按照价值从高到低来区分分别为:皇家同花顺:最高为 Ace (一点)的同花顺。如 A K Q J 10 的同花顺同花顺:同一花色,五张顺字的牌。如:K Q J 10 9 的同花顺四条:有四张同一点数的牌。如:4 4 4 4 9葫芦:三张同一点数的牌。加—对其他点数的牌。如:3 3 3 10 10同花:五张同一花色的牌。如:J 10 8 7 5 的全是红桃的牌顺子:五张顺连的牌。如:5 4 3 2 A 的非原创 2020-09-24 09:54:44 · 4145 阅读 · 0 评论 -
滑动窗口算法框架总结
leetcode 30. 串联所有单词的子串给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”,words = [“foo”,“bar”]...原创 2020-03-28 13:08:02 · 697 阅读 · 0 评论 -
一个通用方法团灭 6 道股票问题!
转载自:https://github.com/labuladong/fucking-algorithm/blob/master/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%B3%BB%E5%88%97/%E5%9B%A2%E7%81%AD%E8%82%A1%E7%A5%A8%E9%97%AE%E9%A2%98.md6 道股票问题买卖股票的最佳时机买卖股票的...转载 2020-03-22 10:53:21 · 297 阅读 · 0 评论 -
你真的熟练掌握二分查找了吗?
二分查找由于思想简单,在经典算法中最容易被初学者忽视。看懂了书上的一种写法后,就以为自己会了,而实际上是一看就会,一写就废。不信的话,先来看一个问题:找出升序数组中小于等于目标值的最大值?(数组中可能不包含目标值)如果感觉很棘手,别着急,看完本文你能随手撸出两种不同的解法。如果你写出来了,也别着急,继续看下去,你会发现你写的不一定完美。好啦,不管怎样,看完绝对不亏,哈哈。一、开门见山不...原创 2020-03-22 02:21:30 · 246 阅读 · 0 评论 -
全排列、组合、组合总和、子集
声明:把递归参数不变的,尽量统一设置为成员变量。全排列全排列问题求解体系基本上分为两大类,一是基于选择,二是基于交换。全排列1:无重复基于选择的经典解法:class Solution { private int[] nums; private List<List<Integer>> result; public List<List<In...原创 2020-03-08 12:34:28 · 470 阅读 · 0 评论 -
leetcode 215. 数组中的第K个最大元素(热门面试题)
题目求解快速选择算法,跟快速排序是一个人发明的,思想和快速排序一样,平均时间复杂度为 O(N)。class Solution { private int[] nums; private int k; public int findKthLargest(int[] nums, int k) { this.nums = nums; ...原创 2020-03-08 11:26:59 · 283 阅读 · 0 评论 -
强化学习Q learning算法最简单的入门(含java实现的小例子)
强化学习强化学习和遗传算法优胜劣汰的思想类似,通过奖惩机制不断强化好的行为,弱化坏的行为。什么是好的行为,什么是坏的行为,这跟你要解决的具体问题有关,比如路径规划问题,走距离目标点较近的路线就是好的行为,走距离目标点较远的路线就是坏的行为。强化学习包含四要素:agent、环境状态、行为和奖励,目标是获得最多的累计奖励。Q learningQ learning 融合了马尔科夫过程和动态规划,...原创 2020-01-07 23:05:21 · 6189 阅读 · 2 评论 -
神奇的数据结构---并查集
树的双亲表示法并查集,拆解为并、查、集,何为集,集合,用树表示,何为并,集合的合并,何为查,判断两个元素是否属于同一集合。基础算法的实现并查集的启发式优化,a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上?小树合并到大树或低树合并到高树。并查集的路径压缩优化,查询是顺便压缩路径,让结点离祖先更近,能大大提升效率,并且压缩路径的代价不大。...原创 2019-12-24 00:44:49 · 358 阅读 · 0 评论 -
leetcode 72.编辑距离
编辑距离可以说是动态规划算法中经典的、知名的题目了,题目难度也不小,是一道很好的动态规划的题目。很可能会出现在面试中动态规划的考察上。题目给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入: word1 = “horse”, word2 =...原创 2019-11-14 11:23:04 · 215 阅读 · 0 评论 -
leetcode 29. 两数相除(Java版)
题目名,两数相除,表面看起来人畜无害。结果…,他喵的提交十几次才过。题目描述(题目难度,中等)给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。示例 1:输入: dividend = 10, divisor = 3输出: 3示例 2:输入: di...原创 2019-04-19 16:53:45 · 658 阅读 · 0 评论 -
leetcode 39. 组合总和(Java版)
题目描述(题目难度,中等)给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [2,3,6,7], target =...原创 2019-06-14 22:50:45 · 594 阅读 · 0 评论 -
leetcode 41. 缺失的第一个正数(Java版)
题目描述(题目难度,困难)给定一个未排序的整数数组,找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1说明:你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。来源:力扣(LeetCode)链接...原创 2019-06-19 15:32:27 · 577 阅读 · 0 评论 -
leetcode 36. 有效的数独(Java版)
题目描述(题目难度,中等)判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字,空白格用 '.' 表示。示例 1:输入: ["5","3",".",".","7",".",".",...原创 2019-06-09 11:21:20 · 477 阅读 · 0 评论 -
leetcode 37. 解数独(Java版)
题目描述(题目难度,困难)编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 '.' 表示。Note:给定的数独序列只包含数字 1-9 和字符 '.' 。你可以假设给定的数独只有唯一解。给定数独永远是...原创 2019-06-12 21:45:52 · 677 阅读 · 0 评论 -
leetcode 30. 串联所有单词的子串(Java版)
题目描述(题目难度,困难)给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”,words = [“foo”,“bar”]输出:[0,9]...原创 2019-04-29 15:47:55 · 729 阅读 · 0 评论 -
leetcode 40. 组合总和 II(Java版)
题目描述(题目难度,中等)给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target ...原创 2019-06-16 21:55:54 · 625 阅读 · 1 评论 -
数组相同数字聚集
题目描述:昨天做 leetcode 组合总和 II 这个题目时,碰到这样一个需求:给定一个数组,数组中存在相同的数字,不对数组排序,将相同的数字聚集在一起。要求时间复杂度为 O(n),否则还不如直接排序呢,emm。例如:{5, 3, 9, 3, 5, 3} 变为 {5, 5, 3, 3, 3, 9}。问题求解示例代码如下:import java.util.HashMap;public ...原创 2019-06-17 19:14:18 · 594 阅读 · 0 评论 -
leetcode 42. 接雨水(Java版)
题目描述(题目难度,困难)给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6来源:力扣(LeetCode)链接:htt...原创 2019-07-11 10:09:00 · 587 阅读 · 0 评论 -
leetcode 43. 字符串相乘(Java版)
题目描述(题目难度,中等)给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1...原创 2019-07-16 21:59:06 · 872 阅读 · 0 评论 -
leetcode 46. 全排列(Java版)
题目描述(题目难度,中等)给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations著作权归...原创 2019-07-30 15:15:27 · 864 阅读 · 0 评论 -
LDA 从陌生到熟悉
LDA是文本建模领域很常用的主题模型。先验分布、后验分布、共轭分布以及共轭先验分布对于参数估计这个问题,频率学派认为参数是一个客观存在的定值,只是我们不知道是多少而已。而贝叶斯学派则认为参数不是一个定值,而是一个服从某一分布的随机变量,使用后验分布的均值或者极大值点作为参数的估计值。在这一参数估计的过程中,就有了先验分布、后验分布、共轭分布以及共轭先验分布的概念。贝叶斯学派先验分布和后验分布...原创 2019-07-21 16:40:22 · 392 阅读 · 0 评论 -
leetcode 49. 字母异位词分组(Java版)
题目描述(题目难度,中等)给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。来...原创 2019-08-05 13:25:07 · 305 阅读 · 0 评论 -
二维数组中的递归算法
这两道题目分别来自爱奇艺 2017 年内推笔试题和 2019 年猿辅导算法题。第一题题目描述Michael 喜欢滑雪这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出,数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 516...原创 2019-08-06 10:31:16 · 1906 阅读 · 0 评论 -
整理部分双指针算法(重点:龟兔算法)
一、同速指针问题描述:从单链表中找到倒数第n个结点。直觉算法遍历一遍链表,得到链表长度 length,然后指针重新指向表头,设置从 0 开始的计数器,指针每往后移动一个,计数器加 1 ,当计数器变为 length - n 时,就找到了倒数第 n 个结点。双指针算法使用两个指针,假设为 p、q,p 指向表头,q 先向后移动指向第 n 个结点。然后两个指针同时向后移动,直至 q 走到链表...原创 2019-02-03 13:46:03 · 467 阅读 · 0 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(Java版)
题目描述(题目难度,中等)给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,...原创 2019-05-03 02:10:54 · 355 阅读 · 0 评论 -
搜索旋转排序数组
题目描述(题目难度,中等)假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6...原创 2019-05-02 23:09:35 · 215 阅读 · 0 评论 -
O(n)时间复杂度寻找数组中的“众数” - 摩尔投票法
问题:在长度为n的数组中找出重复次数超过n/2的数(假设一定存在)。存在O(n)的时间复杂度和O(1)的空间复杂度的解法,即摩尔投票法前言: 直接看摩尔投票法的代码,很难理解其算法思想,过一段时间就会忘记代码怎么写的,在此之前其实我就已经看过不下两次代码了,只记得有这样一种方法,但是具体的就不记得了,所以我们要理解其原理。摩尔投票法摩尔投票法基于这样一个事实,当一个数的重复次数超过数组...原创 2019-02-06 16:18:48 · 1453 阅读 · 0 评论 -
蓄水池抽样
蓄水池抽样,首先有它的应用和它的神奇之处,其次这个也是机器学习领域面试的热门试题。问题一(引子):流式数据(Streaming Data),数据长度为n但不知道,如何从中等概率随机选择一个数据?**解法:**我们以概率1选择第一个数据,以1/2的概率选择第二个数据,以此类推,以1/m的概率选择第m个对象(如果后面某一数据一旦选中,替换掉以前选中的数据)。当所有数据流过时,每个对象具有相同的...转载 2019-02-04 11:12:22 · 460 阅读 · 0 评论 -
RSA算法过程以及正确性证明
本文可以帮助想要完全理解RSA原理的同学,完全掌握理解RSA的原理。原创 2019-02-04 10:02:27 · 5384 阅读 · 1 评论 -
扩展欧几里得算法及贝祖定理的证明
欧几里得算法公式表述:gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)证明:aaa 可以表示为 a=kb+r,r=a%ba = kb + r,r = a\%ba=kb+r,r=a%b假设 ddd 是 (a,b)(a,b)(a,b) 的一个公约数,则有d∣a,d∣bd|a,d|bd∣a,d∣b,而 r=a–kbr = a ...原创 2019-02-03 14:00:34 · 2983 阅读 · 0 评论 -
部分查找算法总结(重点:指数搜索)
前提是列表有序。二分查找是一种分治算法,每次将数组分为大小相等的部分。很熟悉就不用介绍了。时间复杂度为O(lgn)O(\lg n)O(lgn)。示例伪代码:binary_search(A, n, T){ L = 0 R = n − 1 while (L &lt;= R){ m = floor((L + R) / 2) if (A[...原创 2019-02-03 13:50:25 · 1429 阅读 · 0 评论 -
记录一道知乎上看到的POI
前言:毕竟是信息竞赛的题,题的难度系数极大。题目描述有一个长度为n的实数数组a,可以进行任意轮的操作,每轮选择一个i(0 &amp;lt; i &amp;lt; n-1)操作为a[i] = a[i+1] + a[i-1] - a[i],问最终a[0]+a[1]+…+a[n-1]最大可以是多少?题目求解创建一个a的差分数据b,有b[i] = a[i] - a[i-1]。则对a数组...原创 2019-02-03 13:36:15 · 248 阅读 · 0 评论 -
SingleNumber类问题总结归纳
在一堆整数中,高效寻找出现特定次数的数。既然该问题的结果与数字的重复次数有关,那就一定要计数,普通的求解办法是将每个数看成一个整体进行计数,需要O(n)的空间复杂度。而另一个十分有趣的解法是考虑数在计算机里的二进制表示,将数分解到位,按位计数,可以将空间复杂度优化到O(1)。原创 2019-02-16 01:59:10 · 493 阅读 · 0 评论 -
快速幂取余
本文分成以下四个部分,全部都跟取余有关:引理证明介绍快速幂取余了解数论中的欧拉定理模幂运算如果你只想看快速幂取余的部分,可以直接看第二部分。目标一:证明积的取余等于取余的积的取余数学描述为:(a⋅b)%p=((a%p)⋅(b%p))%p (a\cdot b)\%p=((a\%p)\cdot(b\%p))\%p(a⋅b)%p=((a%p)⋅(b%p))%p为了简化书写,介绍同余...原创 2019-02-03 13:28:56 · 740 阅读 · 0 评论 -
三种迷宫生成算法概述
1. Randomized Prim’s algorithm(随机Prim算法)随机Prim算法属于打通墙壁生成迷宫的算法,下面我将以集合的角度来描述此算法。首先是初始化,建立一个所有单元格都被墙隔开的迷宫。以8*8的迷宫为例,将每个单元格进行编号。使用集...原创 2019-02-03 13:19:26 · 6090 阅读 · 0 评论 -
两数组和的差最小问题
题目来源于传说中的华为面试题:有两个长度都为n的数组,分别为a,b。数组元素类型为整型,值任意且无序。要求通过交换a,b数组的元素,使得数组a的和与数组b的和的差最小。 这个题目网上很多博客给出的一种解法都是错的,他们的思路是每次交换一对数据,如果交换能使得差变小就交换,否则就不交换。这个解法简单直观,其实本来目的就是穷举。可是本题却存在这种情况,即找不到任何一对数据的交换使得差变小(这...原创 2019-02-03 13:11:32 · 2346 阅读 · 2 评论 -
leetcode 240. 搜索二维矩阵 II
题目编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 1...原创 2019-02-10 21:43:43 · 452 阅读 · 0 评论 -
leetcode 7. 整数反转(Java版)
题目描述(题目难度,简单)给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,231−1][−2^...原创 2019-02-22 17:11:30 · 542 阅读 · 0 评论