
数据结构与算法
文章平均质量分 60
数据结构与算法
Sivan_Xin
Hi,终于等到你。爱好:Coding&Debug。博客内容:后端方向。喜欢和优秀的人做有挑战的事!
展开
-
动态规划中的股票问题全解析
3、 dp数组初始化:dp[0][0]为第0天持有股票,dp[0][0] -= prices[i]。dp[0][1]表示第0天不持有股票,dp[0][1] = 0。一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);dp[i][j]中i表示第i天,j为[0 - 4]五个状态,dp[i][j]为第i天状态j所剩的最大现金。■ 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]原创 2024-04-28 11:32:33 · 1041 阅读 · 0 评论 -
动态规划中的背包问题全解析
问题转换:求得石头重量总和,再分解为重量相同的两堆,剩下的就是最小的重量。/**dp[j] 为石头的最小重量 最小容量为 sum / 2石头重量、价值为stones[i]。*/sum += i;dp[0] = 0;i ++){j --){背包原问题:我们有i个物品,记作nums[i],并且每个物品价值为value[i],给定背包容量target,怎样才能装到背包的最大价值?背包问题的本质就是:给出一个数组或者取值范围,能否组成我们想要的target?原创 2024-04-11 14:36:42 · 910 阅读 · 0 评论 -
【原创】5分钟拿下Floyd算法
Floyd算法5分钟速通原创 2024-03-20 20:34:52 · 415 阅读 · 0 评论 -
动态规划入门v0.2
确定dp[i]的含义为:爬到第i个台阶的最小花费。随后的问题,比如确定递推公式等问题就可以轻松解决。原创 2023-01-01 23:46:39 · 382 阅读 · 0 评论 -
【蓝桥备战】DFS、BFS
使用dfs算法,使用path数组保存结果,使用used数组判断数字是否使用。以二叉树为例,只有当前节点不能继续遍历时,才会往回退,否则就继续搜索。解法二:把每一个格子都分为两种状态【放(满足条件时)/不放(不需要条件)】。DFS考虑顺序,类似递归,考虑dfs函数的意义。不具有“最短路径”的性质。解法一:类似全排列的思想。**按行进行dfs。**不用考虑同一行的问题。数据结构:使用队列。具有“最短路径”的性质。当满足x为最后的一行并且皇后数量等于n时,才会输出答案。以二叉树为例,类似于二叉树的层序遍历。原创 2022-12-01 00:05:51 · 367 阅读 · 0 评论 -
【蓝桥备战】前缀和+差分+高精度
我们可以先假想nums原数组为空,那么diff数组一开始也为空,但是实际上nums数组并不为空。因此我们每次让diff以(i,j)为左上角到以(i,j)为右下角面积内元素(其实就是一个小方格的面积)去插入 nums[i] [j],等价于原数组nums中(i,j) 到(i,j)范围内 加上了nums[i][j] ,因此执行n*m次插入操作,就成功构建了差分diff数组。如果要修改原数组[x1,y1,x2,y2]范围的值,只需要修改diff数组的四个位置,也就是insert函数。,也就是前缀和的做法。原创 2022-11-30 17:59:29 · 415 阅读 · 0 评论 -
【蓝桥备战】双指针算法+位运算
保留第一层for循环,优化第二层for循环。达到一定条件时,才移动 j 指针。不论原码、反码、还是补码,都分为整数位和符号位,如果符号位是0,则表示正数。整数在计算机中都是以补码的方式存储。原创 2022-11-30 17:08:31 · 148 阅读 · 0 评论 -
【蓝桥备战】题目 01 快排、归并、二分
此时只需要比较p和k的下标,就可以确定要寻找的是p的哪一边。p的下标大于k,则需要缩小右侧边界的范围。,并且p的左边都小于p,p的右边都大于p。即,当前p点为从小到大的第p个数。当我们获得 p 时,原创 2022-11-15 13:10:23 · 106 阅读 · 0 评论 -
【蓝桥备战】快速排序+归并排序+二分查找 基本实现
原因如下:如果是left right 时,并且right = mid- 1,退出循环,这样一次循环会全部包含区间内的内容,下一次循环也不会漏掉mid值。pivot点可以是数组左边、右边、中间,或者任何一个位置。二分查找的思路简单,但我们最应该注意的是。,然而所有的细节问题都。原创 2022-11-13 23:40:55 · 287 阅读 · 0 评论 -
【LeetCode】496、下一个更大元素 I(附算法学习指南)
496、下一个更大元素 Iclass Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { int []ret = new int[nums1.length]; int index=0; while(index< nums1.length) { for (int i = 0; i < nums2.length; i++) {原创 2022-05-03 21:56:16 · 594 阅读 · 0 评论 -
【算法训练营】0.0_开营准备
面对一道题,剖析关键点——回想学过的模型——根据特征找到算法题目特征驱动算法。每节课2h教学+1h回顾+5h刷题+毕业后40h强化。理解大部分内容,背诵较难的模板,完成所有的例题。课前预习(浏览PPT,每个知识点选1道例题)LeetCode每道题应该分类三刷。平均每天分配2h在算法的学习上。先学数据结构——再学习算法。20分钟想不出来就看题解。课上跟住思考的大方向。...原创 2022-08-17 21:31:18 · 159 阅读 · 0 评论 -
【算法训练营】一文“秒杀”时间复杂度
文章目录算法的时间复杂度常见的时间复杂度平均时间复杂度、最坏时间复杂度、空间复杂度写一篇关于时间复杂度的文章,这一定是入门算法必备的知识点了!作者也是一边学习一边分享,如果觉得写的还不错的话,欢迎点一个⭐收藏⭐再走哦~~~算法的时间复杂度作用:通过分析算法时间复杂度来判断哪个程序更优秀。这里给大家列出数学上的解释:时间频度(T(n)):语句执行的次数。假定辅助函数f(n),当n趋近于无穷大时,T(n)/f(n)的极限为不为零的常数时,则记作T(n)=O(f(n))。O(f(n))则是原创 2022-03-19 18:09:11 · 632 阅读 · 3 评论 -
【算法】查找算法—二分查找
文章目录二分查找代码实现扩展/代码实现二分查找二分查找的前提是有序的数组。在本文中会使用递归来实现二分查找。具体思路:使用两个指针来确定数组范围。left==0以及right==a.length-1。通过比较findVal与midVal的值,来确定是向右递归还是向左递归。每次递归都会从当前数组中间(mid)开始,向左或向右。即实现二分。代码实现public class Binarysearch { public static void main(String[] args)原创 2022-03-28 21:56:56 · 1043 阅读 · 6 评论 -
【算法】排序算法—基数排序
文章目录基数排序代码实现基数排序基数排序是使用空间换时间的经典算法思路分析:计算数组中的最大位数。比较数组的个位数,并放入对应数字的桶中。依次取出桶中的元素放回数组。在比较数组的十位数,并放入对应数字的桶中。依次取出桶中的元素放回数组…… 直到比较到最高位为止。思路转化:10个桶可以用二维数组来表示:bucket[10][a.length]。a.length表示待排数组的长度,也就是桶的最大容量。图解算法:注: 以下代码实现的基数排序不可处理负数代码实现在这原创 2022-03-26 23:08:00 · 745 阅读 · 7 评论 -
【算法】排序算法—冒泡排序
文章目录冒泡排序代码实现算法时间复杂度O(n^2)冒泡排序若从小到大排序:相邻的元素两两比较,较小的数后移(下沉),较大的数前移(冒泡),这样一趟比较下来,最大值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。以下是图解:代码实现需要注意的是,在代码中又引入了Boolean类型的变量flag,这样如果提前完成排序即可退出程序。import java.util.Arrays;/** * @Author 不知名网友鑫 * @Date 2022/3/20 **/public c原创 2022-03-20 14:54:17 · 850 阅读 · 5 评论 -
【算法】排序算法—希尔排序
文章目录希尔排序代码实现代码总结希尔排序希尔排序是插入排序的一种,又称缩小增量排序。关于插入排序,可以看我之前的文章哦,下面也附上了链接~算法思路:假设一个长度为10的数组,则将gap==5(初始将gap= a.length/2)作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量(也就是gap/=2),重复上述操作…当增量的大小减到1时,就相当于整个序列被分到一组,最后进行一次直接插入排序,排序完成。图解算法原创 2022-03-22 23:00:27 · 1398 阅读 · 1 评论 -
【算法】排序算法—插入排序
文章目录插入排序代码实现算法的时间复杂度O(n^2)插入排序思路分析:一个数组可以当成两个表,一个有序表,一个无序表。一开始认为数组的第一个元素是有序的,依次将其后面的元素插入到这个有序表中来,直到整个表有序为止。也就是将无序表中的元素插入到有序表中。图解算法:代码实现import java.util.Arrays;/** * @Author 不知名网友鑫 * @Date 2022/3/21 **///从小到大排序public class InsertSort { pub原创 2022-03-21 20:14:59 · 1145 阅读 · 16 评论 -
【算法】递归的简单应用
文章目录关于递归递归入门阶乘打印1~n斐波那契数列递归进阶迷宫问题八皇后问题关于递归简单来说,递归就是函数的重复调用。每一次函数调用都存储在栈中。当栈顶的函数执行完毕,才会执行栈中的下一个元素。递归的几个注意点:明白递归的函数正在进行什么操作,它做了什么事情?在递归中必须要设置结束条件、明确结束条件,并且逐步靠近结束条件。不然会形成无限的递归。递归就是有去(递去)有回(归来)。相同重复逻辑,缩小问题的规模。参考文章递归入门阶乘public static long f(int n){原创 2022-03-17 20:14:40 · 571 阅读 · 8 评论 -
【算法】查找算法—插值/斐波那契查找
文章目录插值查找代码实现斐波那契查找代码实现插值查找适用条件:数组有序,数据量较大,数据连续性较强时,可以使用插值查找,速度较快。其算法和二分查找基本一致,只不过修改了每次查找时mid的值,以达到自适应的效果。mid=left+(right-left)* (findVal-arr[left])/a[right]-a[left];关于二分查找的文章:二分查找代码实现/** * @Author 不知名网友鑫 * @Date 2022/3/29 **/public class Insert原创 2022-03-29 20:09:00 · 863 阅读 · 2 评论 -
【算法】排序算法—选择排序
选择排序从小到大排序:先假定第一层循环当前指向的数就是最小的数,第二层遍历找到数组中最小的数,交换两数的位置,继续第一层循环。即为选择排序,意为选择最大/最小的数与当前所指数进行交换。图示如下:代码实现import java.util.Arrays;/** * @Author 不知名网友鑫 * @Date 2022/3/20 **/public class SelectSort { public static void main(String[] args) {原创 2022-03-20 23:22:29 · 928 阅读 · 15 评论 -
【算法】排序算法—快速排序
快速排序public static void quickSort(int[] arr,int left, int right) { int l = left; //左下标 int r = right; //右下标 //pivot 中轴值 int pivot = arr[(left + right) / 2]; int temp = 0; //临时变量,作为交换时使用 //while循环的目的是让比pivot 值小放到左边 //比pivot 值大放到右边 while( l &原创 2022-03-24 21:45:39 · 1116 阅读 · 3 评论 -
【算法】排序算法—归并排序
归并排序基本思想:分治思想,先“分”后“治”。分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。把数组从上往下逐层折半拆分,再从下往上逐层合并。注意点:归并排序需要准备一个额外的temp数组,来存储两个进行排序后的数组。主要分为图解算法:代码实现import java.util.Arrays;/** * @Author 不知名网友鑫 * @Date 2022/3/25 **/public class Merg原创 2022-03-25 23:01:34 · 523 阅读 · 0 评论 -
【数据结构】栈的实际应用
栈实现计算器给出中缀表达式,自动计算结果。(不包括括号、小数计算)思路分析代码实现栈实现计算器2给出中缀表达式,转换为后缀表达式并计算结果。(包括括号计算)思路分析先将中缀表达式转换为ArrayList数组。再将ArrayList数组转换为后缀表达式ArrayList数组。(重点)按后缀表达式计算规则计算并输出结果。代码实现...原创 2022-03-16 20:38:16 · 1046 阅读 · 6 评论 -
【数据结构】 环形队列(Java代码实现—带注释详解)
目录前言关于队列必须理解的地方Java代码实现前言随风潜入夜,润物细无声。—《春夜喜雨》(每天一道数据结构,Day 1)关于队列队列是有序列表,可以用数组或链表来实现。队列的特点:先入先出。今天我们采用数组实现队列。比较关键的是要弄明白rear、front、maxSize之间的关系,最好自己先推一遍,这样理解地更加深刻。图解如下:必须理解的地方front、rear、maxSize使 front=0;rear=0;实际队列比maxSize小1。 空出一个空间做约定。出队列:原创 2022-02-05 23:48:48 · 1050 阅读 · 1 评论 -
【数据结构】 稀疏数组
/** * @Author 不知名网友鑫 * @Date 2022/2/5 **/public class sparseArray { public static void main(String[] args) { //给出二维数组(五子棋盘) int[][] a = new int[11][11]; a[1][2] = 1; //黑子 a[2][3] = 2; //白子 //打印二维数组原创 2022-02-05 14:19:34 · 292 阅读 · 1 评论 -
【入门必备】Java数据结构详解
数据结构入门必看!本文整理了稀疏数组、队列、链表、栈这几种经典的数据结构。快来一起敲代码吧!!!原创 2022-03-15 19:51:07 · 9392 阅读 · 21 评论