算法学习及感悟
文章平均质量分 51
青山酒温如南
这个作者很懒,什么都没留下…
展开
-
算法练习——前缀树
前缀树 Trie又被称为前缀树、字典树,所以当然是一棵树。上面这棵Trie树包含的字符串集合是{in, inn, int, tea, ten, to}。每个节点的编号是我们为了描述方便加上去的。树中的每一条边上都标识有一个字符。这些字符可以是任意一个字符集中的字符。比如对于都是小写字母的字符串,字符集就是’a’-‘z’;对于都是数字的字符串,字符集就是’0’-‘9’;对于二进制字符串,字符集就是0和1。 Trie树是简单但实用的数据结构,通常用于实现字典查询 力扣208实现 Trie (前缀树) 对于当前字原创 2022-01-12 19:25:36 · 147 阅读 · 0 评论 -
算法练习——动态规划
动态规划 动态规划对于每一个子子问题只求解一次,将其解保存在一个表格里面,从而无需每次求解一个子子问题时都重新计算,避免了不必要的计算工作。 解决动态规划问题一般分为四步: 1、定义一个状态,这是一个最优解的结构特征 2、进行状态递推,得到递推公式 3、进行初始化 4、返回结果 力扣509斐波那契数 F(n)=F(n−1)+F(n−2) 根据状态转移方程和边界条件 class Solution { public int fib(int n) { if (n < 2) {原创 2022-01-05 21:14:33 · 296 阅读 · 0 评论 -
算法练习——记忆化算法
记忆化搜索 递归的过程中有许多的结果是被反复计算的,这样会大大降低算法的执行效率。 将已经计算出来的结果保存起来,计算用到的时候直接取出结果,避免重复运算,因此极大的提高了算法的效率。 力扣509斐波那契数 F(n)=F(n−1)+F(n−2) class Solution { public int fib(int n) { if (n == 0) return 0; if (n == 1) return 1; int[] memory = n原创 2021-12-30 00:08:28 · 440 阅读 · 0 评论 -
算法练习——贪心算法
贪心算法 贪心算法(又称贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。 不从整体最优上加以考虑,仅是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解 但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。 在贪心算法中,我们总是做出当时看来最佳的选择,然后再求解剩下唯一的子问题。 贪心算法做出选择时可能会依赖于之前的选择或者子问题的解,但是绝对不依赖于将来的选择或者子问题的解。 力扣322零钱兑换 想要总硬币数最少,肯定是优先用大面值硬币,所以对 coin原创 2021-12-30 00:07:32 · 1967 阅读 · 0 评论 -
算法练习——并查集
并查集 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。 并查集通常包含两种操作 查找(Find):查询两个元素是否在同一个集合中 合并(Union):把两个不相交的集合合并为一个集合 用集合中的某个元素来代表这个集合,该元素称为集合的代表元。一个集合内的所有元素组织成以代表元为根的树形结构。 对于每一个元素 parent[x]指向x在树形结构上的父亲节点。如果x是根节点,则令parent[x] = x。 对于查找操作,假设需要确定x所在的的原创 2021-12-22 23:20:24 · 862 阅读 · 0 评论 -
算法练习——宽度优先搜索算法 BFS
宽度优先搜索算法 BFS 主要应用:二叉树搜索或者图搜索 主要思想:层层递进,一层一层遍历 和DFS(深度优先)差别: DFS侧重“分支” BFS侧重“层” 基本实现思想: (1)顶点v入队列。 (2)当队列非空时则继续执行,否则算法结束。 (3)出队列取得队头顶点v; (4)查找顶点v的所以子节点,并依次进入队列; (5)转到步骤(2)。 力扣 102. 二叉树的层序遍历 用一个二元组 来表示状态 它表示某个节点(node)和它所在的层数(level) 每个新进队列的节点的层数都是父亲节点的层数加一 最后原创 2021-12-15 22:18:20 · 933 阅读 · 0 评论 -
算法学习——深度优先算法
深度优先算法 DFS 对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 力扣 938二叉搜索树的范围和 1.root节点为空——返回0 2.root节点的值大于high右子树所有节点值大于跟节点, ——返回左子树的范围和 3.root节点的值小于low左子树小于low, ——返回右子树的范围和 4.root节点的值再指针[low,high]范围内 ——返回root节点值、左子树的范围和、右子树的范围和 class Solution { public int rangeSumBS原创 2021-12-08 22:33:10 · 310 阅读 · 0 评论 -
算法练习——回溯算法(二)
力扣77 组合 递归获取 利用一个 stack 存储中间结果,不断进行出栈入栈,这样肯定就能拿全。 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; public class Solution { public List<List<Integer>> combine(int n, int k) { L原创 2021-12-01 21:25:23 · 74 阅读 · 0 评论 -
算法练习——回溯法
回溯法 类似于枚举,向下递归尝试找到答案 找到答案尝试别的可能或返回答案 找不到答案返回上一层递归,常识其他路径 力扣 22 括号生成(回溯法) 左括号必须以正确的顺序闭合 left>=right 我们可以通过跟踪到目前为止放置的左括号和右括号的数目,只在序列仍然保持有效时才添加 如果左括号数量不大于 n,放一个左括号,右括号数量小于左括号的数量,放一个右括号。 class Solution { public List<String> generateParenthesis(int原创 2021-11-24 11:38:00 · 143 阅读 · 0 评论 -
算法练习——分治算法
分治法 将大问题分割成一个个小问题 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题 合并:将各个子问题的解合并为原问题的解 分治策略:对于一个规模为n的问题,若该问题可以容易的解决(比如规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解。 力扣 169 多数元素(分治法) 在数组中出现次数大于数组长度的一原创 2021-11-24 00:27:12 · 345 阅读 · 0 评论 -
算法练习——递归
递归 时间复杂度O(N);空间复杂度O(N); 在方法里调用方法 四个要素 1.接受的参数 2.返回的值 3.终止的条件 4.递归的拆解:如何递归下一层(循环的改变量) 力扣 509 斐波那契数列 f(n) = f(n-1) + f(n-2) 当n>=2; 0,1,1,2,3,5,8… fuction(int n){ if(n<2){ return n==1?1:0; } int sum = fuction(n-1)+fuction(n-2) return sum; } 力扣 2原创 2021-11-23 23:09:17 · 175 阅读 · 0 评论 -
算法学习——滑动窗口
滑动窗口 目的:减少while循环 标志:数组中定长问题(以k为长度,求最大(小)的和)、求连续的数 理解:每次这组数移动只需要加上新的数并减去末尾的数 例子: 1 3 5 7 8 5 4 3 5 7 int[] arr = {1,3,5,7,8,5,4,3,5,7} 长度k == 3;求没三个相邻数相加最大和; 第一次:sum == 1+3+5;arr[0]+arr[1]+arr[2]; 第二次:sum + 7 -1; arr[0]+arr[1]+arr[2]+arr[3]-arr[0]; 第三次:s原创 2021-11-17 11:00:00 · 97 阅读 · 0 评论 -
算法学习——二分法查找(2)
162 寻找峰值 对于所有有效的 i 都有 nums[i] != nums[i + 1],又nums[-1] = nums[n] = -∞ 且1 <= nums.length <= 1000,即数组中必有一个元素,有多个元素时则互不相等,即使数组中只有一个元素,这个元素的左右两边都是-∞,那么这唯一的元素就是峰值。 要求在一个数组里找出一个峰值元素并返回其下标,可以采用二分查找,首先找到中间节点mid,如果大于两边就返回当前下标index,如果左边的结点比mid大,那么继续在左半区间查找,这里面原创 2021-11-16 22:43:58 · 215 阅读 · 0 评论 -
算法学习——二分法查找(1)
二分法查找 时间复杂度低,查找次数少 应用在有序的一组数 生活场景 猜数字1~100;告诉你猜大了,猜小了;每次对半猜,猜中的次数就最少; 假设目标数字是29; 第一次猜50,得到返回值,猜大了; 那么这个数就在1~50之间; 第二次猜25,得到返回值,猜小了; 这个数在25~50之间; 第三次猜37,得到返回值,猜大了; 这个数就在25~37之间; 第四次猜29,就会得到这个数 例1 力扣704 public int search(int[] nums, int target) {原创 2021-11-12 13:31:00 · 118 阅读 · 0 评论 -
算法学习——双指针算法
双指针算法 三种类型 1.普通双指针 两个指针同时往一个方向移动 2.对撞双指针 两个指针面对面移动(有序) 两个数相加,结果小于目标数移动前面一个指针,结果大于目标数移动后一个指针 3.快慢双指针 慢指针 + 快指针(环形链表) 快指针移动两步,慢指针移动一步,相遇的时候即环形 141 快慢指针同时=head 当快指针不为空并且快指针的下一个不为空 即链表有结尾代表不为环形 快指针与慢指针相遇时即为环形 public class Solution { pub原创 2021-11-08 19:42:30 · 390 阅读 · 0 评论