算法
今天你学习了么
这个作者很懒,什么都没留下…
展开
-
背包问题
背包问题有 n 个物品和容量为 V 的背包,第 i 件物品的体积为 c[i],价值为 w[i]。现在的目标是确定要将哪些物体放入背包,以保证在体积 不超过背包容量 的前提下,背包内的 总价值最高?1. 01背包问题约束条件: 每种物品数量为 1,可以选择放或不放状态定义: f[i][v] 为前 i 个 物品中,体积恰好为 v 时的最大价值。result = max(f[n][0~V]) 即最终答案,它表示前 n 个物品的最大价值,假设这时容量为 k ,由于 0 <= k <= V,因此转载 2020-12-28 16:31:29 · 263 阅读 · 0 评论 -
三角形最大周长
转载给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长,如果不能形成任何面积不为零的三角形,返回0题意可以翻译为:求满足三角形定义的三边之和最大值三角形定义上要求【任意两边和大于第三边】,即【短边和大于长边】,我们只需排序,依次从高到低取三条边,满足定义返回三边和即可。又因为,过程中每次校验都可能找到答案,所以其实完整的排序是浪费的,我们只...转载 2020-04-11 15:40:01 · 498 阅读 · 0 评论 -
最大公因数和最小公倍数
1. 最大公约数① 暴力穷举暴力穷举法的思路:从两个数之间找最小的数,然后用这个数往下减,若是两个数都能够被整除,那个数就是最大公约数int maxNumber(int m, int n) { int temp = m > n ? n : m; for (int i = temp; i > 0; i--) { if (m % i == 0 && n ...原创 2020-03-27 13:52:26 · 220 阅读 · 0 评论 -
二分查找法
二分查找Although the basic idea of binary search is comparatively straightforward,the details can be surprisingly tricky…1. 寻找一个数(基本的二分搜索)int binarySearch(int[] nums, int target) { int left = 0;...转载 2020-03-11 13:34:52 · 98 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为...转载 2020-03-09 18:43:06 · 86 阅读 · 0 评论 -
重建二叉树
1. 从中序与后序遍历序列构造二叉树输入某二叉树的后序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3] 3 / \ 9 20 / \ 15 7重点在于对界限的计算/** * Definiti...原创 2020-03-08 21:13:26 · 65 阅读 · 0 评论 -
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先1. 对于普通二叉树1.1 递归要找p,q两个阶段的公共祖先,从根节点root开始递归,可以分成三种情况① p,q在root的左右两边,这个时候root就是要找的点② root==p或者q,这个时候root就是要找的点③ p,q在root的同一侧,这个时候像那一侧递归查询在遍历的时候当你遇到节点 p 或 q 时,返回一些布尔标记。...原创 2020-03-08 18:57:21 · 194 阅读 · 0 评论 -
Arrays的几个常用方法
1. 复制数组有关1.1 使用 copyOf() 方法对数组进行复制Arrays.copyOf(dataType[] srcArray,int length);默认从原数组的第一个元素(索引值为 0)开始复制,目标数组的长度将为 length。如果 length 大于 srcArray.length,则目标数组中采用默认值填充;如果 length 小于 srcArray.length,则复...原创 2020-03-06 18:38:19 · 333 阅读 · 0 评论 -
堆排序
图解排序算法(三)之堆排序堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图: 同时,我们对堆中...转载 2020-03-03 21:00:36 · 110 阅读 · 0 评论 -
两种情况下的O(1)最大值最小值求法
① 构建队列,满足先进后出,且在O(1)时间复杂度下能求最大值用一个队列保存正常元素,另一个双向队列保存单调递减的元素入队列时,第一个队列正常入栈;第二个队列是递减队列,所以需要与之前的比较,从尾部把小于当前value的全部删除(因为用不到了)出队列时,第一个队列正常出栈;第二个队列的头部与出栈的值作比较,如果相同,那么一起出栈public class MaxQueue {...原创 2020-03-02 16:19:01 · 1146 阅读 · 0 评论 -
查找素数
转载素数的定义很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。比如让你写这样一个函数:// 返回区间 [2, n) 中有几个素数 int countPrimes(int n)// 比如 countPrimes(10) 返回 4// 因为 2,3,5,7 是素数你会如何写这个函数?我想大家应该会...转载 2020-02-18 15:27:13 · 204 阅读 · 0 评论 -
双指针解决链表问题
1. 快慢指针找链表中点使用快慢指针在一次遍历中找到:慢指针一次走一步,快指针一次走两步,快慢指针同时出发。当快指针移动到链表的末尾时,慢指针到链表的中间。通过慢指针将链表分为两部分 private ListNode endOfFirstHalf(ListNode head) { ListNode fast = head; ListNode slow = hea...原创 2020-02-10 12:44:38 · 341 阅读 · 0 评论 -
前缀 中缀 后缀表达式
转载自1. 中缀表达式==(3 + 4) × 5 - 6 ==中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。2...转载 2020-02-08 14:33:03 · 249 阅读 · 0 评论 -
树的深度优先搜索和广度优先搜索的实现
1. 深度优先depth first search,DFS可以使用先序遍历来实现递归版//先序遍历 public void PreOrder(BinaryTreeNode node){ if(node!=null){ System.out.println(node.getData()); //先访问根节点 PreOrd...转载 2020-02-08 11:45:35 · 492 阅读 · 0 评论 -
单调栈解决 Next Greater Number 一类问题
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。 nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x大的元素。如果不存在,对应位置输出-1。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. 输...转载 2020-02-07 16:55:28 · 374 阅读 · 0 评论 -
贪心算法
总在做出当前看起来最好的选择,一些情况下即使不能得到整体最优解,但最终结果是最优解的很好的近似解贪心选择的基本要素贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择来达到最优子结构性质:一个问题的最优解包含其子问题的最优解背包问题与0-1背包问题类似,所不同的是,在选择物品i装入背包的时候,可以选择物品i的一部分装入背包,而不一定全部装入背包,这是与0-1背包问...原创 2020-01-07 12:24:19 · 176 阅读 · 0 评论 -
算法基本概念
数据结构关心的是不同的数据结构在计算机解题中的作用和效率,关心的是具体问题算法着重于算法设计技术的适用性和效率,提升为通用方法算法学算法学是这样的一门学科:他告诉我们如何评估不同的外在因素对可供选择算法的影响,好让我们可以选择一种最符合特定情况的算法;他也告诉我们如何为一个特定任务设计一种新算法算法的定义和特性算法是解某一特定问题的一组有穷规则的集合,具有有限性,确定性,输入,输出和能...原创 2020-01-04 19:19:44 · 433 阅读 · 0 评论 -
分支限界
分支限界的基本思想分支限界和回溯法都是在解空间树中进行搜索,但是他们的搜索方式不同,对于回溯法,他是从根节点开始以深度优先的策略进行搜索;而分支限界则是从根节点开始,以宽度优先为的方式进行搜索分支限界通常用来找问题的一个最优解,而回溯法用来找所有的可行解两种分支限界法队列式(FIFO)优先级队列式...原创 2020-01-03 19:36:57 · 1646 阅读 · 0 评论 -
回溯法
回溯法具有限界函数的深度优先生成法回溯法的基本思想从一条路往前走,能进则进,不能进则退回来,换一条路再试羽毛球最佳配对问题羽毛球队有男女运动员各n人。给定2个n×n 矩阵P和Q。P[i][j]是男运动员i和女运动员 j配对组成混合双打的男运动员竞赛优势;Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势;由于技术配合和心理状态等各种因素影响,P[i][j]不一定等于Q[j...原创 2019-12-19 19:39:05 · 468 阅读 · 0 评论 -
动态规划
动态规划与分治的区别问题都可以分小为子问题,原问题的解由子问题的最优解构成(最优子结构);不同之处在于,动态规划求解的问题分出来的子问题不相互独立(重叠子问题),所以如果这类问题用分治法去求效率很低(分治法不会保留子问题的解,所以相同子问题的解无法公用,会被重复计算),动态规划所要做的就是保存已经得到子问题的答案,再之后需要用的时候可以直接拿过来用(以空间换取时间)这也就是为什么分治法一般采用...原创 2019-12-17 21:03:51 · 244 阅读 · 0 评论 -
递归与分治策略
直接或间接的调用自身的算法称为递归算法,而分治法是把原先规模为n的问题P(n),分解为k个规模较小,相互独立,结构与原问题结果相同的子问题后,利用子问题的解合并得到原问题的解因为分治法产生的子问题往往是原问题的较小规模,所以为递归技术的使用提供了便利原创 2019-12-16 21:07:01 · 355 阅读 · 0 评论 -
排序算法总结
这里写自定义目录标题排序算法冒泡排序选择排序插入排序希尔排序归并排序排序算法最常见的有十大排序算法,该文章是参考一像素的十大经典排序算法学习时所作的代码实现和总结一像素的十大经典排序算法以下实现都按非降序进行排序冒泡排序基本思路:重复走访要被排序的数列,每次比较相邻的两个元素,如果前一个比后一个大则交换他们的顺序。注:每一轮结束,该轮的最后一个元素都是当前轮最大的,不用再参与下一轮的...原创 2019-12-16 15:01:17 · 311 阅读 · 0 评论