算法
ColdBrew311
这个作者很懒,什么都没留下…
展开
-
贪心啊贪心
贪心就是每次都选择一个局部最优解,推到最后得到一个全局最优解。动态规划不一样的是,动态规划的每一步的不同选择会导致最后结果的不同。比如从一堆纸币里选择10次怎么选出来额度最高,适用贪心算法就是每次都从那堆纸币里拿出面额最大的一张,这样选择10次以后得到的总面额肯定是最大的。又比如在一个二维数组的矩形路径上,要选择一条花费最少的路径,这一步的选择会影响下一步的选择,这种情况就应该用动态规划。那么贪心是不是就是动态规划的特殊情况。leetcode 455 分饼干小孩胃口数组g = [1原创 2022-03-23 10:34:55 · 1755 阅读 · 0 评论 -
前缀和&差分
一个只用初始化依次,但是却要反复检索计算多次,需要在最开始做预处理。=======================以下请看版权声明将matrix[][]的前缀和数组定义为prefix[][],定义prefix[i][j]表示从[0, 0]位置到[i, j]位置的子矩阵所有元素的和。 S(O,D)=S(O,C)+S(O,B)−S(O,A)+D如果求 preSum[i][j]preSum[i][j] ...原创 2022-03-16 19:30:31 · 1337 阅读 · 0 评论 -
广度优先遍历
什么时候需要分层遍历?什么时候不用分层遍历?有时候刷题看解答就会疑惑,为什么在广度优先遍历的时候有的题解答中类似以下代码:while (!queue.isEmpty()) { int queueSize = queue.size(); for (int i = 0; i < queueSize; i++) { int[] node = queue.poll(); int curNodeValue = matrix[node[0]][node原创 2022-03-15 20:28:16 · 252 阅读 · 0 评论 -
并查集并查集
并查集就是一个一群人找祖宗的过程:最开始,每个人就是一个单独的部落,根据某个条件判断他俩属于一个部落,比如他俩相似,或者有其它属性,属于一个部落的两个人,就有一个祖宗,找到同宗的,那就部落合并,最开始的部落数就可以-1了遍历到最后的最后,所有人都认祖归宗,那么部落数就是最后的结果 /** * 剑指offer 相似的字符串 * * 【定义】: * 如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两原创 2022-03-12 20:07:40 · 251 阅读 · 0 评论 -
二分法总结
出处:代码随想录 代码随想录 代码随想录代码随想录二分法的两种区间定义:1.[left, right] 左闭右闭2.[left, right) 左闭右开一、target定义在左闭右闭区间内:[left, right]此时:while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <= if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nu.原创 2022-02-27 10:59:34 · 503 阅读 · 0 评论 -
树树树二叉树
出处:代码随想录 代码随想录 代码随想录代码随想录二叉搜索树有序,若左子树不为空,则左子树上所有节点的值都小于根节点的值。若右子树不为空,则右子树上所有节点的值都小于根节点的值。左右子树分别为二叉搜索树。用数组来存储二叉树如何遍历的呢?如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。链式存储是大家很熟悉的一种方式,那么我们来看看如何顺序存储呢?public class BinaryTree { /**.原创 2022-02-24 22:06:11 · 587 阅读 · 0 评论 -
单调栈题集
出处:代码随想录 代码随想录 代码随想录 代码随想录通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。 /** * leetcode 739. 每日温度 * 单调栈,使用空间换时间,因为遍历的过程中要用一个栈来记录右边第一个比当前元素大的元素,优点是只需要遍历一遍 * * 需要明确: * 【单调栈里存放的元素】:存放下标足够 * 【单调栈里是递增还是递减】:顺序为从栈.原创 2022-02-15 17:01:03 · 68 阅读 · 0 评论 -
回溯算法各种
出处:代码随想录代码随想录 代码随想录代码随想录要会设置回溯函数终止条件,进入回溯函数,首先判断,是否符合终止条件。形成回溯搜索树,集合大小构成树的宽度,递归深度构成树的深度,遍历过程伪代码:if (终止条件) { 记录结果; return;}for (选择 : 本层集合中元素) { // for循环的执行次数和当前节点的孩子数一致 处理节点; backtracking(路径,选择列表); // 递归过程 撤销结果,达到回溯目的}for:..原创 2022-02-09 20:37:30 · 759 阅读 · 1 评论 -
while在算法中的用法收集
出处:算法第四版public class Helper { public static boolean isLess(int[] a, int i, int j) { return a[i] < a[j]; } public static void exch(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; }原创 2022-02-08 20:04:55 · 448 阅读 · 0 评论 -
快速排序Java版本
出处:算法第四版public class QuickSort { public static void quickSort(int[] a) { helper(a, 0, a.length - 1); } private static void helper(int[] a, int lo, int hi) { if (hi <= lo) { return; } // 这一步中,.原创 2022-02-07 14:32:50 · 424 阅读 · 0 评论 -
回溯法和动态规划方法解UniquePath
出处:javascript-algorithms/src/algorithms/uncategorized/unique-paths at master · trekhleb/javascript-algorithms · GitHubimport java.util.Arrays;/** * 唯一路径问题 * * 机器人位于m * n网格左上角,只能向下或向右移动到达右下角 * 求出,共有多少种可能的独特路径 */public class UniquePath { /**原创 2022-02-02 20:58:34 · 521 阅读 · 0 评论 -
解背包问题
出处:https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problemimport java.util.ArrayList;import java.util.List;/** * 背包问题就是给一些物品(set,不重复),每个物品有重量和价值 * 决定每个物品的数量,保证包能装得下,并且所有物品价值最高 * * [0/1背包问题] 就是一个物品的个数为1或者原创 2022-01-28 17:51:05 · 549 阅读 · 0 评论 -
四种方法解决JumpGame
出处:https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/jump-gameimport java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * @description: * Given an array of non-negative integers, you are原创 2022-01-27 15:23:34 · 6708 阅读 · 2 评论