![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 89
bfhonor
没有天生的高手,更没有永远的菜鸟。
展开
-
最长公共子序列(LCS)问题、0-1背包问题
一、最长公共子序列(LCS)问题最长公共子序列(Longest Common Subsequence,LCS)leetcode_1143_最长公共子序列:https://leetcode-cn.com/problems/longest-common-subsequence/求两个序列的最长公共子序列长度①、[1,3,5,9,10] 和 [1,4,9,10] 的最长公共子序列是 [1,9,10],长度为 3②、ABCBDAB 和 BDCABA 的最长公共子序列长度是 4,可能是✓ ABCBDAB原创 2021-01-07 21:33:05 · 457 阅读 · 0 评论 -
动态规划(Dynamic Programming)
一、动态规划(Dynamic Programming)动态规划,简称DP是求解最优化问题的一种常用策略通常的使用套路(一步一步优化)① 暴力递归(自顶向下,出现了重叠子问题)② 记忆化搜索(自顶向下)③ 递推(自底向上)1、动态规划的常规步骤动态规划中的“动态”可以理解为是“会变化的状态”① 定义状态(状态是原问题、子问题的解)✓ 比如定义 dp(i) 的含义② 设置初始状态(边界)✓ 比如设置 dp(0) 的值③ 确定状态转移方程✓ 比如确定 dp(i) 和 dp(i –原创 2021-01-06 19:44:10 · 1281 阅读 · 0 评论 -
分治(Divide And Conquer)
分治(Divide And Conquer)分治,也就是分而治之。它的一般步骤是①、将原问题分解成若干个规模较小的子问题(子问题和原问题的结构一样,只是规模不一样)②、子问题又不断分解成规模更下的子问题,直到不能再分解(直到可以轻易计算出子问题的解)③、利用子问题的解推导出原问题的解因此,分治策略非常适合用递归需要注意的是:子问题之间是相互独立的分治的应用:①、快速排序②、归并排序③、Karatsuba算法(大数乘法)(1)主定理(Master Theorem)分治策略通常遵原创 2021-01-02 16:36:10 · 809 阅读 · 1 评论 -
贪心算法(Greedy)
贪心算法(Greedy)贪心策略,也称为贪婪策略每一步都采取当前状态下最优的选择(局部最优解),从而希望推导出全局最优解。贪心的应用①、哈夫曼树②、最小生成树算法:Prim、Kruskal③、最短路径算法:Dijkstra(1)练习1 – 最优装载问题(加勒比海盗)在北美洲东南部,有一片神秘的海域,是海盗最活跃的加勒比海①、有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值②、海盗船的载重量为 W,每件古董的重量为 ????i,海盗们该如原创 2021-01-01 20:47:06 · 902 阅读 · 0 评论 -
回溯(Back Tracking)
回溯(Back Tracking)回溯可以理解为:通过选择不同的岔路口来通往目的地(找到想要的结果)每一步都选择一条路出发,能进则进,不能进则退回上一步(回溯),换一条路再试树、图的深度优先搜索(DFS)、八皇后、走迷宫都是典型的回溯应用不难看出来,回溯很适合使用递归练习 – 八皇后问题(Eight Queens)八皇后问题是一个古老而著名的问题在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击:任意两个皇后都不能处于同一行、同一列、同一斜线上请问有多少种摆法?(1)八皇后问题原创 2021-01-01 12:46:15 · 365 阅读 · 0 评论 -
汉诺塔(Hanoi)图解递归算法
(5)练习3 — 汉诺塔(Hanoi)编程实现把 A 的 n 个盘子移动到 C(盘子编号是 [1, n] )每次只能移动1个盘子大盘子只能放在小盘子下面1、汉诺塔 — 1个盘子2、汉诺塔 — 2个盘子3、汉诺塔 — 3个盘子3、汉诺塔 — 思路其实分 2 种情况讨论即可(1)当 n == 1时,直接将盘子从 A 移动到C(2)当 n > 1时,可以拆分成3大步骤①将 n– 1 个盘子从 A 移动到B② 将编号为 n 的盘子从 A 移动到C③将 n– 1 个盘子从B 移动到C原创 2020-12-31 15:38:20 · 30004 阅读 · 7 评论 -
递归(Recursion)
递归(Recursion)递归:函数(方法)直接或间接调用自身。是一种常用的编程技巧生活中的案例:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?【从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?『从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什呢?……』如果递归调用没有终止,将会一直消耗栈空间最终导致栈内存溢出(Stack Overflow)所以必需要有一个明确的结束递归的条件也叫作边界条件、递归基原创 2020-12-31 15:37:40 · 1050 阅读 · 1 评论 -
十大经典排序算法之基数排序(Radix Sort)、桶排序(Bucket Sort)
基数排序(Radix Sort)基数排序非常适合用于整数排序(尤其是非负整数),因此只演示对非负整数进行基数排序执行流程:依次对个位数、十位数、百位数、千位数、万位数…进行排序(从低位到高位)个位数、十位数、百位数的取值范围都是固定的0~9,可以使用计数排序对它们进行排序(1)基数排序 — 实现import org.junit.Test;import java.util.Arrays;public class TestDemo { @Test public void原创 2020-12-29 19:59:09 · 298 阅读 · 0 评论 -
十大经典排序算法之计数排序(Counting Sort)
计数排序(Counting Sort)之前学习的冒泡、选择、插入、归并、快速、希尔、堆排序,都是基于比较的排序平均时间复杂度目前最低是 O(nlogn)计数排序、桶排序、基数排序,都不是基于比较的排序它们是典型的用空间换时间,在某些时候,平均时间复杂度可以比 O(nlogn)更低计数排序于1954年由Harold H. Seward提出,适合对一定范围内的整数进行排序计数排序的核心思想统计每个整数在序列中出现的次数,进而推导出每个整数在有序序列中的索引(1)计数排序 — 最简单的实现原创 2020-12-29 16:29:06 · 1102 阅读 · 0 评论 -
十大经典排序算法之希尔排序(Shell Sort)
希尔排序(Shell Sort)1959年由唐纳德·希尔(Donald Shell)提出希尔排序把序列看作是一个矩阵,分成 ???? 列,逐列进行排序从某个整数逐渐减为1当 ???? 为1时,整个序列将完全有序因此,希尔排序也被称为递减增量排序(Diminishing Increment Sort)矩阵的列数取决于步长序列(step sequence)✓ 比如,如果步长序列为{1,5,19,41,109,…},就代表依次分成109列、41列、19列、5列、1列进行排序✓ 不同的步长序列,执原创 2020-12-28 20:07:30 · 295 阅读 · 0 评论 -
十大经典排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)1960年由查尔斯·安东尼·理查德·霍尔(Charles Antony Richard Hoare,缩写为C. A. R. Hoare)提出昵称为东尼·霍尔(Tony Hoare)(1)快速排序 — 执行流程①、从序列中选择一个轴点元素(pivot)假设每次选择0位置的元素为轴点元素②、利用pivot将序列分割成2个子序列将小于pivot的元素放在pivot前面(左侧)将大于pivot的元素放在pivot后面(右侧)等于pivot的元素放哪边都可以原创 2020-12-28 09:02:23 · 311 阅读 · 0 评论 -
十大经典排序算法之归并排序(Merge Sort)
归并排序(Merge Sort)1945年由约翰·冯·诺伊曼(John von Neumann)首次提出执行流程①、不断地将当前序列平均分割成2个子序列✓ 直到不能再分割(序列中只剩1个元素)②、不断地将2个子序列合并成一个有序序列✓ 直到最终只剩下1个有序序列(1)归并排序 — divide实现@Overrideprotected void sort() { leftArray = (T[]) new Comparable[array.length >> 1];原创 2020-12-27 11:45:19 · 3877 阅读 · 2 评论 -
二分搜索算法详解(Binary Search)
二分搜索(Binary Search)如何确定一个元素在数组中的位置?(假设数组里面全都是整数)如果是无序数组,从第0个位置开始遍历搜索,平均时间复杂度:O(n)如果是有序数组,可以使用二分搜索,最坏时间复杂度为O(logn)(一)、二分搜索 — 思路假设在[begin,end)范围内搜索某个元素 v,mid == (begin + end)/ 2①、如果v < m,去[begin , mid)范围内二分搜索②、如果v > m,去[mid + 1, end)范围内二分搜索③、如果v == m原创 2020-12-26 20:35:54 · 36827 阅读 · 8 评论 -
十大经典排序算法之插入排序(Insertion Sort)
插入排序(Insertion Sort)插入排序非常类似于扑克牌的排序执行流程①、在执行过程中,插入排序会将序列分为2部分。头部是已经排好序的,尾部是待排序的②、从头开始扫描每一个元素每当扫描到一个元素,就将它插入到头部合适的位置,使得头部数据依然保持有序。什么是逆序对?数组< 2,3,8,6,1 >的逆序对为:<2,1> < 3,1> <8,1> <8,6> <6,1>,共5个逆序对插入排序的时间复杂度与逆序对的数量成正比关系。原创 2020-12-26 19:04:46 · 1915 阅读 · 3 评论 -
十大经典排序算法之堆排序(Heap Sort)
堆排序(Heap Sort)堆排序可以认为是对选择排序的一种优化执行流程:①、对序列进行原地建堆(heapify)②、重复执行以下操作,直到堆的元素数量为1交换堆顶元素与尾元素堆的元素数量减1对0位置进行1次siftDown操作堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结原创 2020-12-24 21:06:23 · 233 阅读 · 2 评论 -
十大经典排序算法之冒泡排序(Bubble Sort)、选择排序(Selection Sort)
十大排序算法冒泡、选择、插入、归并、快速、希尔、堆排序,属于比较排序(Comparison Sorting)冒泡排序(Bubble Sort)冒泡排序也叫做起泡排序执行流程①、从头开始比较每一对相邻元素,如果第一个比第二个大,就交换它们的位置。执行完一轮后,最末尾那个元素就是最大的元素。②、忽略①中曾经找到的最大元素,重复执行步骤①、直到全部元素有序。原创 2020-12-24 20:45:08 · 1052 阅读 · 0 评论 -
Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort)原理:比较两个相邻的元素,将值大的元素交换至右端。思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。第一趟比较完成后,最后一个数一定是...原创 2019-11-28 20:21:59 · 178 阅读 · 0 评论