随笔分类 - 算法
摘要:
动态规划问题特性 在前面的学习中,我们了解了动态规划是如何通过子问题分解来求解原问题的。实际上子问题分解是一种通用的算法思路,在分治、动态规划、回溯中的侧重点不同。 分治算法递归地将原问题划分为多个相互独立的子问题,直至最小子问题,并在回溯中合并子问题的解,最终得到原问题的解。 动态规划也对问题进行
阅读全文
动态规划问题特性 在前面的学习中,我们了解了动态规划是如何通过子问题分解来求解原问题的。实际上子问题分解是一种通用的算法思路,在分治、动态规划、回溯中的侧重点不同。 分治算法递归地将原问题划分为多个相互独立的子问题,直至最小子问题,并在回溯中合并子问题的解,最终得到原问题的解。 动态规划也对问题进行
阅读全文
摘要:
动态规划 初识 动态规划(dynamic programming)是一个重要的算法范式,它将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。 本节中,我们从一个经典例题入手,先给出它的暴力回溯解法,观察其中包含的重叠子问题,再逐步导出更高效的动态规划解法。
阅读全文
动态规划 初识 动态规划(dynamic programming)是一个重要的算法范式,它将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。 本节中,我们从一个经典例题入手,先给出它的暴力回溯解法,观察其中包含的重叠子问题,再逐步导出更高效的动态规划解法。
阅读全文
摘要:
n皇后问题 Question 根据国际象棋的规则,皇后可以攻击与其处于同一行、同一列或一条斜线上的棋子,给定n个皇后和一个n x n大小的棋盘,寻找使得所有皇后之间无法互相攻击的摆放方案。 如下图所示,当n=4时,共可找到两个解。从回溯算法的角度看,n x n大小的棋盘共有\(n^2\)个格子,给出
阅读全文
n皇后问题 Question 根据国际象棋的规则,皇后可以攻击与其处于同一行、同一列或一条斜线上的棋子,给定n个皇后和一个n x n大小的棋盘,寻找使得所有皇后之间无法互相攻击的摆放方案。 如下图所示,当n=4时,共可找到两个解。从回溯算法的角度看,n x n大小的棋盘共有\(n^2\)个格子,给出
阅读全文
摘要:
子集和问题 无重复元素的情况 Question 给定一个正整数数组nums和一个目标正整数target,请找出所有可能的组合,使得组合中的元素和等于target。给定数组无重复元素,每个元素可以被选取多次。以列表形式返回这些组合,列表中不包含重复的组合 例如,输入集合{3,4,5}和目标整数9,解为
阅读全文
子集和问题 无重复元素的情况 Question 给定一个正整数数组nums和一个目标正整数target,请找出所有可能的组合,使得组合中的元素和等于target。给定数组无重复元素,每个元素可以被选取多次。以列表形式返回这些组合,列表中不包含重复的组合 例如,输入集合{3,4,5}和目标整数9,解为
阅读全文
摘要:
全排列问题 全排列是回溯算法的一个典型应用,它的定义时在给定一个集合(如数组或字符串)的情况下,找出其中元素的所有可能的排列 示例: 输入数组 所有排列 [1] [1] [1,2] [1,2], [2,1] 1,2,3] [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,
阅读全文
全排列问题 全排列是回溯算法的一个典型应用,它的定义时在给定一个集合(如数组或字符串)的情况下,找出其中元素的所有可能的排列 示例: 输入数组 所有排列 [1] [1] [1,2] [1,2], [2,1] 1,2,3] [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,
阅读全文
摘要:
回溯算法 定义 回溯算法(backtracking algorithm)是一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或尝试了所有可能的选择都无法找到解为止。 回溯算法通常采用深度优先搜索来遍历解空间。在二叉树中,前
阅读全文
回溯算法 定义 回溯算法(backtracking algorithm)是一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或尝试了所有可能的选择都无法找到解为止。 回溯算法通常采用深度优先搜索来遍历解空间。在二叉树中,前
阅读全文
摘要:
判断子序列 子序列是在字符串或者数组中,删除一些元素(也可以不删除)而不改变剩余元素的顺序的相对位置而形成的新数组或字符串 (例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 题目描述(力扣392题) 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的
阅读全文
判断子序列 子序列是在字符串或者数组中,删除一些元素(也可以不删除)而不改变剩余元素的顺序的相对位置而形成的新数组或字符串 (例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 题目描述(力扣392题) 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的
阅读全文
摘要:基数排序 基数排序(radix sort)的核心思想与计数排序一致,也通过统计个数来实现排序。计数排序适用于数据量n较大但数据范围m比较小的情况。假设我们需要对n=106个学号进行排序,而学号是一个8位数字,这意味着数据范围m=108非常大,使用计数排序需要分配大量内存空间,而基数排序可以避免这种情
阅读全文
摘要:计数排序 计数排序(counting sort)通过统计元素数量来实现排序,通常应用于整数数组。 简单实现 给定一个长度为n的数组nums,其中的元素都是“非负整数”,计数排序的整体流程如下: 遍历数组,找出其中最大的数组,记为m,然后创建一个长度为 m+1 的辅助数组counter。 借助coun
阅读全文
摘要:桶排序 前面的快速排序、归并排序、堆排序等都是属于“基于比较的排序算法”,它们通过比较元素间的大小来实现排序。此类排序算法的时间复杂度无法超越O(nlogn)。下面介绍几种“非比较排序算法”,它们的时间复杂度可以达到线性阶。 桶排序(bucket sort)是分治策略的一个典型应用。它通过设置一些具
阅读全文
摘要:堆排序 堆排序(heap sort)是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”实现堆排序。 输入数组并建立小顶堆,此时最小元素位于堆顶。 不断执行出堆操作,依次记录出堆元素,即可得到从小到大排序的序列。 以上方法虽然可行,但需借助一个额外数组来保存弹
阅读全文
摘要:求最大公因数 求两数的最大公因数通常的做法是对两个数因式分解,找出共同的素数,然后求出最大公因数(GCD)。但是当数字越大时,因式分解就越困难,此时,使用欧几里得算法就能高效求出其最大公因数。 欧几里得算法 欧几里得算法(又称辗转相除法)用于计算两个数的最大公因数,被称为是世界上最古老的算法。 基本
阅读全文
摘要:归并排序 归并排序(merge sort)是一种基于分治策略的排序算法,包含下图所示的“划分”和“合并”阶段。 划分阶段:通过递归不断地将数组从中点处分开,将长数组的排序问题转换为短数组的排序问题。 合并阶段:当子数组长度为1时终止划分,开始合并,持续地讲左右两个较短的有序数组合并为一个较长的有序数
阅读全文
摘要:快速排序 快速排序(quick sort)是一种基于分治策略的排序算法,运行高效,应用广泛。 快速排序的核心操作是“哨兵划分”,其目标是::选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。具体流程如下: 选取数组最左端元素作为基准数,初始化两个指针
阅读全文

浙公网安备 33010602011771号