![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法积累
文章平均质量分 53
日常算法积累
时间的痕迹01
这个作者很懒,什么都没留下…
展开
-
玩转Random的正确姿势
我们知道,在数学领域里面0到1之间的小数是无穷无尽的,所以如果从数学角度上来讲,要计算0到1之间某个小数出现的概率是不现实的,但是作为计算机领域的人员应该会注意到,大多数编程语言中随机数的出现是等概率的,为什么会这样呢,因为在计算机里面,是有精度限制的,所以能表示的小数范围是有限的,而不是无穷无尽的,那么各个语言在设计的时候,通过一定的设计就可以实现等概率返回某个小数,下面以java语言为例在 Java 中,原创 2024-03-08 17:37:00 · 805 阅读 · 0 评论 -
归并排序-逆序对
逆序对:给定一个数据,从左往右,从第一个数开始,它右边每一个比它小的都能和它组成一个逆序对,比如{3, 4, 1, 2},对于3来说右边比它小的只有1,2,对于4来说,比它小的也只有1,2,对于1和2来说右边没有比它们自己小的,所以最终的逆序对是4,而{3, 4, 2,1}的逆序对则是5,因为2的右边有一个1比它小。之前的文章里有写归并排序的最小和问题(原创 2024-01-25 16:47:57 · 454 阅读 · 0 评论 -
归并排序-最小和
首先澄清一下最小和的概念:给定一个数组,对于数组中的每个元素,把它前面所有比它小的元素全部加起来生成一个小和,然后把每个元素对应的小和全部加起来生成整个数组的一个小和,比如给定数组{3, 2, 2, 4, 1, 5},每个元素对应的小和是{0,0,0,7,0,12},整个数组的小和就是19。{2,2,3,4}和{1,5}合并为{1,2,2,3,4,5},局部累加和为2*1+2*1+3*1+4*1=11,因为左边的数组都比右边的数组中的5要小。2,4合并为{2,4},局部累加和是2*1,因为左边比右边小。原创 2023-12-15 16:08:30 · 118 阅读 · 0 评论 -
计算n的阶乘-递归与迭代之间的转换
尽管大多数情况下递归与迭代可以相互转换,但也有一些特殊情况,比如涉及到特定数据结构(如树、图)的问题,或者一些复杂的动态规划问题,它们可能更适合于使用其中的一种方法,因为另一种方法可能会导致代码变得过于复杂且难以理解。:对于递归来说,需要存在一个或多个基本的情况,在这些情况下,不需要进一步递归。总结:某些递归是可以通过迭代来实现的,那么递归和迭代能够相互转换的条件是什么呢,我们来看看不同的AI模型的回答。例如,3的阶乘表示为3!:无论是递归还是迭代,都需要一种方式将子问题的结果合并到整个问题的答案中。原创 2023-12-07 17:37:18 · 1038 阅读 · 0 评论 -
归并排序的非递归实现
第一种思路:用步长来切分数组,也就是我们在切分数组的时候,每个子数组里面的数据个数要等于步长,假设给定数组:[3,2,5,4],我们初始给定一个步长step=1,那么第一轮切分出来的子数组分别是[3],[2]合并得到[2,3],[5],[4]合并得到[4,5],这样第一轮步长等于1就完成了,第二轮步长等与原步长乘以2,也就是每一轮都将原步长乘以2,这样得到的子数组分别是[2,3]和[4,5],进行合并,依次类推。原创 2023-12-07 10:28:03 · 67 阅读 · 0 评论 -
用栈实现队列的功能,用队列实现栈的功能?
我们首先来看用栈实现队列的功能,首先大伙儿要知道队列和栈的特点其实是“相反”,那么要想用栈来实现队列的功能,一个栈肯定是做不到的,我们可以用两个栈来实现,一个push栈,一个pop栈,push栈用来添加入队数据,pop栈用来出队数据,不论是入队还是出队的时候都可以加上一个检查和迁移操作,并且迁移必须遵守原则:pop栈为空,然后从push栈往pop栈迁移数据的时候必须一次性全部完成,这样就能满足先入先出的规则了。原创 2023-11-24 13:23:51 · 67 阅读 · 0 评论 -
用数组实现队列和栈
【代码】用数组实现队列和栈。原创 2023-11-21 17:09:03 · 88 阅读 · 0 评论 -
算法与数据结构之链表
链表的定义,相信大家都知道,这里就不赘述了只是链表分单向链表和双向链表,废话不多说,直接上代码。原创 2023-11-05 00:06:23 · 319 阅读 · 0 评论 -
异或运算的魔法
举个例子[1,2,3,4,1,2,4],我们要找的数据是3,根据前面的结论,任何一个数异或0等于它本身,同一个数异或它自己等于,那么这个数组其实我们把它排序看看[1,1,2,2,3,4,4],所以1,2,4在与tmp异或完之后tmp等于0,最终结果就是4了。思路:用一个临时变量tmp,初始值为0,从数组开头一直异或到结尾,最后tmp就是要找的数。第二题:给定一个数组,只有一个数在其中出现了奇数次,其他的数出现偶数次,找出这个数。1、任何数与0异或,结果是这个数本身。2、任何数和它自己异或,结果是0。原创 2023-10-30 19:40:24 · 179 阅读 · 0 评论 -
快速排序算法
快速排序二:给定一个数组,进行排序,要求排序完成之后,小于数组最后一个元素的数据全部在它的左边,大于它的全部在它的右边,等于的全部在中间,左右两边内部不要求有序,比如原数组是[5, 6, 3, 1, 2, 3]排序完之后:[1,2,3,3,5,6 ],也就是原数组最后一个数是3,排序完之后小于等于3的全部在3的左边,大于3的全部在3的右边,等于3的全部在中间。1、我们定义一个小于目标数据的区域,它的初始位置在数组第一个元素的前面,也就是下标为-1的位置,取名为lessEquals。原创 2023-10-26 09:55:17 · 652 阅读 · 2 评论 -
排序算法之归并排序
分别有两个指针P1和P2指向两个小数组的第一个元素,然后移动两个指针,哪个数组对应的指针所指的数据小,就将它拷贝到help当中,如果有一个指针先移动结束,那么另一个数组当前指针所指的位置以及后面的数据直接拷贝到help即可。新建一个数组,长度是总数组的长度,也就是4,我们记这个数组为help。将help数组的数据还原到原数组中。原创 2023-10-24 16:40:30 · 607 阅读 · 0 评论 -
给定一个文件夹,不允许用递归,统计其下面的文件数量,包括子文件夹下面的文件
对于统计一个文件夹下面的文件的数量,大家第一反应肯定是递归调用来实现,现在有这么一个目录结构:root1和root2下面各有一个文件file1.txt和file2.txt,所以最终统计出来的文件数量应该是3。ps:其实这里不一定要用Stack,也可以用queue等集合都可以实现,与递归的方式相比,各有优缺点吧,如果文件夹的数量过多,递归可能会导致StackOverflow,第二种方式可能会导致oom。原创 2023-10-17 10:29:22 · 150 阅读 · 0 评论 -
二叉树相关算法
那么我们可以看出来,不论是哪种遍历方式,其在处理左右子节点的时候,逻辑都是一样的,都是要递归处理,前序遍历:头左右,也就是先头后左再右:1245367。中序遍历:左头右,也就是先左后头再右:4251637。后序遍历:左头右,也就是先左后右再头:4526731。不同的只是头结点的输出时机。原创 2023-10-16 23:51:12 · 280 阅读 · 0 评论 -
合并K个升序链表
我们利用Java自带的PriorityQueue,这个queue底层实现实际上是通过数组实现的小根堆(小顶堆,名字无所谓怎么叫啦),反正就是加进去的数据可以自动排序,所以我们可以利用所有有自动排序的功能的集合来实现这个功能,只是队列用起来方便一点,像treeset等有序集合要一边加一边删有点麻烦,至于说能不能用java自带的这些工具,这个题目的重点不是让你实现排序,所以我觉得是可以的,当然要自己实现一个排序的集合,其实也不难。给你一个链表数组,每个链表都已经按升序排列。原创 2023-10-13 14:34:15 · 72 阅读 · 0 评论 -
用位运算实现加减乘除法
除法:除法是乘法的反向推导,比较绕,比如15/5=3,意思就是5*2+5*1=15,其中2就是2的一次方,1就是2的0次方,也就是说一个数a除以b,那么a一定可以表示为:b*2的0次方+b*2的1次方+....,我们说乘法实际上是加法实现的,那么除法其实就是减法的实现过程,比如15/5,也就是从15中不断地减去5,直到不够减或者为0为止,也就是:15-5*2-5*1=0,其中2就是2的一次方,1就是2的0次方,那么15/5实际上就是2的0次方加上2的一次方。减法:有两种方式,一种是跟加法一样,通过借位。原创 2023-10-12 14:50:20 · 207 阅读 · 0 评论 -
判断一个整数是否回文
回文数字的定义:第一位和最后一位相等,第二位和倒数第二位相等...一次类推,比如1221,12321等等,也就是说一个数字如果是回文,那么将它。解法三:一个数字如果是回文,那么它的前半部分和后半部分的反转一定相等,相当于是在解法二的基础上的优化,减少了循环的次数。解法一:投机取巧,用Java的StringBuilder的reverse方法。解法二:将数字反转,得到反转之后的值与原值相比较。反转之后,一定和原来的值相等。原创 2023-10-09 16:57:55 · 96 阅读 · 0 评论 -
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单,用java实现
另外一种就是取反思想:a说他不和x比,正面是第一个人等于a且第二个人等于x,这种条件是不满足的,那么取反就是只要第一个人不等于a或者第二个人不等于x即可。(第一个人不等于c或者第二个人不等与x。第一个人不等于c或者第二个人不等与x。* 甲队:a vs 乙队:y。* 甲队:a vs 乙队:z。* 甲队:b vs 乙队:x。* 甲队:b vs 乙队:y。* 甲队:b vs 乙队:z。* 甲队:c vs 乙队:x。* 甲队:c vs 乙队:y。* 甲队:c vs 乙队:y。* 甲队:a vs 乙队:x。原创 2023-09-21 17:11:16 · 1002 阅读 · 0 评论 -
二分查找算法
题目:给定一个已经排好序的数组和一个目标数据,把目标数据插入给定的数组中。思路:因为数组是已经排好序的,所以可以用二分查找来快速定位要插入的位置。原创 2023-09-21 09:46:52 · 41 阅读 · 0 评论