编程算法
文章平均质量分 65
算法
Dean.song
脚踏实地
展开
-
回溯算法(排列/组合/子集)
为什么需要回溯呢,如果你一条道走到黑就只能得到最多一种全排列,回溯就是寻找同一层的其他路径,这样就能得到更多的全排列。每个元素都需要被选,但是选择的顺序不同,被选中的元素带有红色标记,它的下一步就不能选它本身(因为需要无重复);,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。返回的解集中,子集可以按。返回该数组所有可能的子集(幂集)。给定一个可包含重复数字的序列。给定一个不含重复数字的数组。返回所有不重复的全排列。原创 2023-03-22 14:58:33 · 278 阅读 · 0 评论 -
Leetcode773滑动谜题(BFS)
根据上图,下标4的位置,可以做的选择有三种(1,3,5),由于规模是固定的,每个位置可以做的选择也是可以手算观察得到。,返回最少可以通过多少次移动解开谜板,如果不能解开谜板,则返回。现在的问题是,如何把二维数字简化,使得我们处理起来更简单?每一层都可能会进行相应的操作,这种情况下考虑BFS。与一个相邻的数字(上下左右)进行交换.我们需要考虑,每次可以进行的操作是什么?一次 移动 定义为选择。拉平后,如何找到每次进行的选择?来表示, 以及一块空缺用。)有 5 块砖瓦,用数字。给出一个谜板的初始状态。原创 2023-03-21 09:28:00 · 173 阅读 · 0 评论 -
回溯与剪枝(HDU2553”N皇后问题“)
斜对角:从(i,j)向斜对角走a步,新坐标(r,c)有四种情况,即(i-a,j-a),(i+a,j-a),(i-a,j+a),(i+a,j+a),所以综合起来看,新皇后位置满足|i-r|!第二行,排除同列和斜线,扩展新的子结点(这里不用排除同行,因为一直向下走,始终不在同一行),如此往复,直到得出可行的方案。在棋盘上放置8个皇后,使它们不同行,不同列,不同对角线。N皇后问题是8皇后问题的拓展。从第一行开始放置皇后,第1行从左到右有4种方案,产生4个子结点;关键问题:在拓展结点时如何去掉不符合条件的子节点?原创 2023-03-15 20:51:17 · 350 阅读 · 0 评论 -
几何对象基本元素与表现
圆的定义可以通过一个方程来表示,例如 (x-a)^2 + (y-b)^2 = r^2,其中 (a,b) 是圆心,r 是半径。它返回一个向量,该向量的方向垂直于原始两个向量,长度为两个向量所围成平行四边形的面积。向量内积(也称为点积)是两个向量的数学表达式,用于评估向量的相似性。它可以计算为两个向量的对应元素的乘积的和。向量大小,也称为向量的模,是一维向量的长度,它反映了向量在空间中的长度。点 (point) 表示空间中的位置,它有空间中的坐标,例如在三维空间中,点有 (x, y, z) 坐标。原创 2023-01-31 12:55:02 · 288 阅读 · 0 评论 -
并查集(Java实现)
任务: 维护多个不相交的集合,支持两种操作:合并两个集合,查询一个元素所在的集合。说明: 维护一个森林,每一棵树都代表一个集合,树根元素为这个集合的代表元。利用数组father[]查询记录每个元素的父亲节点。查询一个元素所处集合时,只需不断寻找父节点,即可找到该元素所处集合的代表元。合并两个集合时,先找到两个集合代表元x,y,然后令father[x]=y即可。优化: 路径压缩,沿着树根的路径找到元素a所在集合代表元b后,对这条路径上的所有元素x,令father[a]=b;原创 2023-01-20 16:56:27 · 1531 阅读 · 0 评论 -
数学基本算法
素数筛法是一种用来筛选素数的算法。最简单的素数筛法是埃氏筛法(Sieve of Eratosthenes)。该算法的基本思想是:首先将数字从小到大列出来,然后用2去筛,将2留下,其他的数都删去;再用下一个素数,也就是3筛,将3留下,其他的数都删去;接下来用下一个素数5筛,首先将5×2=10以后的数删去,再将5×3=15以后的数删去,接下来用下一个素数7筛,不断重复下去......直到筛完为止。这样得到的就是素数。原创 2023-01-14 14:03:29 · 685 阅读 · 0 评论 -
等差素数数列
等差素数数列原创 2023-01-12 22:09:43 · 789 阅读 · 0 评论 -
最短路径算法
Dijkstra算法是用来计算一个结点到其他结点的最短路径的算法。可以用来解决计算图论中单源最短路径问题。原创 2023-01-11 17:39:22 · 559 阅读 · 0 评论 -
后缀数组详解
我们可以将这些后缀作为键,创建一个有序数组并使用二分查找来搜索数组,比较被查找的键和所有的后缀。先计算每个位置开始的长度为2的子串顺序,再利用这个结果计算长度为4的子串顺序,不断倍增,直到长度大于等于n就得到后缀数组。用Java substring()方法创建一个由字符串s的所有后缀字符串(由字符串的所有位置开始得到的后缀字符串)数组,将该数组排序。原字符串的每个子串都是某个后缀字符串的前缀。暴力解法:将字符串每个起始位置为i的子字符串与另一个起始位置为j的子字符串相比较,记录最长子字符串。原创 2022-12-20 20:40:32 · 372 阅读 · 0 评论 -
排序算法学习(Java)详解
排序代码对实现 Java 的 Comparable接口的任何类型的数据都有效,但只能是是同一种数据类型的排序(你可以对int double char等数据类型排序,但你不能同时出现不同的数据类型)。重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。基于插入排序的快速排序算法,对于大规模乱序数组插入排序会很慢,因为它只能交换相邻的元素,元素只能一点点地从数组地一端移动到另一端。快速排序是一种分治的排序算法,将一个数组分成两部分,两部分独立地排序。原创 2022-12-15 20:52:14 · 286 阅读 · 0 评论 -
单源最短路径(Dijkstra算法详解&&Java实现)
在寻找加权无向图中的最小生成树的Prim算法:构造最小生成树每一步都向这棵树中添加一条新的边。Dijkstra算法采用了类似的方法计算最短路径树。关于Prim算法可点击下方链接进行了解。原创 2022-12-14 13:01:59 · 1506 阅读 · 0 评论 -
Prim算法&最小生成树&Java超详解
Prim算法计算最小生成树,它的每一步都会为一颗生长树添加一条边。一开始这棵树只有一个顶点,然后我们会向它逐步添加边,每次总是将下一条连接树中的顶点与不在树中的顶点且权重最小的边加入到树中。原创 2022-12-13 14:31:38 · 1693 阅读 · 0 评论 -
动态规划(Dynamic Programming)不同路径
此题dp[i][j]由dp[i-1][j]和dp[i][j-1]递推得出,由上层推导出下层,从左到右一层一层遍历就好。dp[i][j]是由dp[i-1][j]和dp[i][j-1]推导出来的,dp[i][j-1]从(0,0)到(i,j-1)的不同路径数,dp[i-1][j]从(0,0)到(i-1,j)的不同路径数,两者相加就是(0,0)到(i,j)的不同路径数。最后得出dp[m-1][n-1]就是到达右下角的不同路径数。dp[i][j]就是到达第(i,j)格子有多少种不同路径。原创 2022-11-13 10:07:54 · 192 阅读 · 0 评论 -
动态规划(Dynamic Programming)最小花费爬楼梯
由于你可以向上走一步或者两步,dp[i]到达i的最小花费是由到达第i-1和第i-2的最小花费 dp[i-1],dp[i-2]之间的最小值+cost[i],这个加上cost[i]是因为你只要到达i位置你就得花费cost[i]dp数组的初始化,数组初始化很重要,因为需要递推所以不同的初始化所递推出的结果可能不同,dp[i]由dp[i-1]和dp[i-2],初始化dp[0]和dp[1]就行,其他均由dp[0],dp[1]推出。可以先设置小的子问题,来模拟一边dp数组,验证其正确性。原创 2022-11-13 09:24:35 · 295 阅读 · 0 评论 -
蓝桥杯 2017试题I 分巧克力(二分求解)
题目所给最小边长为1,使用二分法,确定下边界为1,最大值为r,mid=(1+r)/2.区间划分成[1,mid-1][mid,r] 将mid*mid的巧克力分给各个小朋友,每块巧克力可以分成(Hi/mid,Wi/mid);算出每块巧克力可分出来的块数之和sum小于小朋友的个数,那么则不够分,r=mid-1,mid=(1+r)/2,用来减小mid的大小以提高sum的总数,若大于小朋友的总数,则成立,但是每个小朋友渴望分到最大的一块,所以将mid=1,mid=(1+r)/2以增加mid的个数。...原创 2022-07-25 21:47:30 · 334 阅读 · 0 评论 -
无重复最长字符串滑动窗口
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。输入: s = "abcabcbb"输入: s = "pwwkew"输入: s = "bbbbb"原创 2022-08-19 14:17:52 · 128 阅读 · 0 评论 -
递增三元组 蓝桥杯2018年试题F
排序后可进行二分查找,A中小于B[i]中最大的一个A[i],求出数组a中小于B[i]的个数wa,当A[j]原创 2022-07-27 11:44:59 · 256 阅读 · 0 评论 -
动态规划 01背包问题
DP0-1背包问题原创 2022-07-20 12:32:38 · 203 阅读 · 0 评论 -
Floyd算法求图的最短路径
Floyd算法可以算出任意两点的最短路径,可以处理有负边,但不能处理负环。负环是指累加起来为负数。httpshttpshttpshttps。原创 2022-07-31 20:24:48 · 648 阅读 · 0 评论 -
BFS广度优先搜索 (迷宫问题)
从起点零出发,可从下和右拓展,起点零的结点(1,1,0)表示第一行第一列步数为0,可以自己设置顺序向某一方向拓展,这里使用右下左上顺序进行拓展,拓展之后有两个结点(1,2,1)(2,1,1)广度优先搜索的基本思想从图中一个未遍历的结点出发,先遍历这个结点相邻结点,再依次遍历相邻结点的相邻结点。2.队首结点可扩展的点入队,如果没有可扩展的点,将队首结点出队。重复该步骤,直到到达目标位置或队列为空。迷宫有n行m列单元格组成,每个单元格都是空地或者障碍物,求出从起点到终点的最短路径长度。...原创 2022-07-20 17:32:32 · 938 阅读 · 0 评论