算法
算法实战讲解
镇天雷帝
这个作者很懒,什么都没留下…
展开
-
算法之动态规划
文章目录 求解动态规划的核心问题是穷举 重叠子问题、最优子结构、状态转移方程就是动态规划三要素 如何写出状态转移方程 明确 base case -> 明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义。 ...原创 2020-07-24 07:40:31 · 79 阅读 · 0 评论 -
算法之动态规划流程
文章目录 写动态规划,先想暴力递归尝试,然后避免重复计算进行优化,所以当没有重复计算的时候很难改成动态规划,避免重复计算 我们要找那些值是不被依赖的,找到固定状态,用空间换时间,记录下来 不要重复计算。分析可变参数,哪几个可变参数的值能代表返回状态,几个可变参数,就构造几维表。然后去看basecase确定表中固定不变的值,再看位置依赖写出动态规划(看你是怎么调动递归的) ...原创 2020-07-12 18:17:14 · 131 阅读 · 0 评论 -
算法之选择排序
简单来说,选择排序就是你在每次执行某次选择循环的时候,先从未排序的部分选出一个最大(或者最小的数),当有比它大(或者比它小)的数就进行替换,然后按照你的要求是升序还是降序,然后和未排序的首元素进行交换**(记住一定是交换位置,如果你直接放置的话,会导致原来数组的元素缺失)** 那么选择排序稳定吗?答案是不稳定。为什么? 比如 5,8,5,2,9 这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素 2,与第一个 5 交换位置,那第一个 5 和中间的 5 顺序就变了,所以就不稳定了。正是因此,相对于冒原创 2020-05-23 16:51:51 · 78 阅读 · 0 评论 -
算法之插入排序
首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。 如图所示,要排序的数据是 4,5,6,1,3,2,其中左侧为已排序区间,右侧是未排序区间。 代码如下: #include <iostream> #include <vector> using namespac原创 2020-05-23 09:21:13 · 100 阅读 · 0 评论 -
算法之冒泡排序
冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。 冒泡排序要注意的点有两个: 1.他是可以一种可以稳定排序的算法(稳定排序就是,多个值相同时,每个值得相对位置不变) 2.要比书本上多加一个变量,用于判断某次冒泡操作是否数据移动,当没有数据移动时就不用在继续了,因为已经排好序了。减少没必要的操作。 C++代码如下: #include <io原创 2020-05-23 00:46:43 · 135 阅读 · 0 评论 -
算法之递归算法
一、什么是递归? 1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。 2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。 3.基本上,所有的递归问题都可以用递推公式来表示,比如 f(n) = f(n-1) + 1; f(n) = f(n-1) + f(n-2); f(n)=n*f(n-1); 二、为什么使用递归?递归的优缺点? 1.优点:代码的表达力很强,写起来简洁。 2.缺点:空间复杂度高、有堆栈溢出风险、存在重复计算原创 2020-05-21 17:35:43 · 584 阅读 · 0 评论