自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 收藏
  • 关注

原创 异或运算相关应用

那么从袋子里一直拿2个球在放回一个球,就可以类似于袋子里的0和1一起做异或运算的过程,因此,当黑球为偶数个数时,所有0和1做异或运算,答案为0,最终袋子里百分百为白球;当黑球为基数个数时,所有0和1做异或运算,答案为1,最终袋子里百分百是黑球。拿出的是2个白球、或者2个黑球,那么就往袋子里重新放入1个白球,就相当于1^1=0,0^0=0,这样就很显然了。在这题中,将设这2种出现奇数次的数分别为a,b,将数组中所有的数做异或运算,得到的答案为a^b,如果分别得到a和b的值,这是个问题。

2024-09-18 15:44:44 668

原创 堆结构常见题

【代码】堆结构常见题。

2024-09-13 13:46:11 150

原创 哈希表、有序表和比较器的用法

【代码】哈希表、有序表和比较器的用法。

2024-09-11 15:24:39 173

原创 堆结构与堆排序

已知数组arr,它的排列顺序为大根堆时,加入一个新的数,如何能让整个数组的排列顺序变成大根堆?已知数组arr,它的排列顺序为大根堆时,第一个数变笑了,如果调整使它重新变成大根堆?向上调整大根堆,时间复杂度为O(logN)。向下调整大根堆,时间复杂度为O(logN)。

2024-09-10 16:12:54 210

原创 随机选择算法

因为荷兰国旗问题的时间复杂度是O(n),在随机的情况下,第一次循环是在N的规模下产生一个荷兰国旗问题,第二次循环是在N/2的规模下产生的荷兰国旗问题,第三次循环是在N/4的规模下产生的荷兰国旗问题,因此时间复杂度为N + N/2 + N/4 + N/8 +...,因此时间复杂度为O(n)。找到一个无序数组中第k大的元素,要求时间复杂度O(n)。时间复杂度为什么是O(n)?

2024-09-03 15:13:17 157

原创 随机快速排序

随即快排时间复杂度:O(n*logn)

2024-09-02 16:31:27 114

原创 归并排序及其应用

例如,数组 s = [1, 3, 5, 2, 4, 6] ,在 s[0] 的左边小于或等于 s[0] 的数的和为 0;给定一个数组,将其切割为左右两份,则整个数组的小和等于左数组的小和 + 右数组的小和 + 跨越左右数组的小和,且计算“跨越左右数组的小和”时,如果加上左、右各自有序这个设定,会获得计算的便利性。在 s[5] 的左边小于或等于 s[5] 的数的和为 1+3+5+2+4=15。1)思考一个问题在大范围上的答案,是否等于,左部分的答案 + 右部分的答案 + 跨越左右产生的答案。

2024-08-30 17:26:55 288

原创 二叉树的非递归遍历

用两个栈实现,这种方法是建立在前序遍历代码的基础上(前序遍历是中->左->右,稍微改动代码,将这个顺序改成中->右->左,然后建立一个新栈,将所有节点push到这个新栈中,这样从这个新栈中弹出来的顺序就是左->右->中,即为后序遍历!非递归遍历,都是用栈实现,本质上都是用栈的进出来模仿递归行为,任何递归解法都可以转换成栈来解决。用一个栈实现,对比后序遍历解法1,只用到一个栈,空间复杂度较好。

2024-08-02 11:27:10 301

原创 双端队列的实现

我们再调用pollLast函数,这是从右端删除数据,可以删除掉节点5。从这里可以看出,双端队列还具有先进后出的特性(节点5最后加入,但是先被删除)。是否先进先出还是先进后出取决于如何加入数据和删除数据,如果从左端(右端)加入数据,右端(左端)删除数据,就是先进先出;如果是从左端(右端)加入数据,左端(右端)删除数据,就是先进后出。可以看出,双向队列具有先进先出的特性,因为在这个例子中,在左端加入的节点1是最先加入的,在右端删除节点,节点1也是最先被删除的。下面我们用数组来创建双端队列。

2024-07-29 15:34:07 559

原创 最小栈问题

第一步:在stack栈中压入元素4时,stack栈中只有元素4,因此stack栈中最小元素为4,故在min栈中压入元素4。第三步:在stack栈中再次压入元素3,将此元素与min栈中栈顶元素比较,3>2,因此元素3不放入,放入栈顶元素2至栈中。第四步:在stack栈中再次压入元素4,将此元素与min栈中栈顶元素比较,4>2,因此元素4不放入,放入栈顶元素2至栈中。第二步:在stack栈中再次压入元素2,将此元素与min栈中栈顶元素比较,若小于,则放入,因此min栈中压入元素2。

2024-07-24 14:19:02 480

原创 队列和栈的相互实现

数据首先进入到栈1,进入顺序为1 -> 2 -> 3 -> 4 -> 5,再将栈1的数据压入栈2,这时数据从栈2弹出,弹出顺序即为1 -> 2 -> 3 -> 4 -> 5,完成了先进先出,实现了两个栈实现队列的过程。大致思想,每次将数据放入队列中,都要将队列中所有数据依次弹出,再压入队列中,这样队列中的所有元素的顺序就反过来了,即可做到先入后出。将数据压入第一个栈,再将第一个栈的数据压入第二个栈,此时第二个栈的弹出顺序就与队列一致了。因为队列两端是开口的,栈是单口的,用栈来实现队列必须要用两个栈。

2024-07-24 10:42:45 590

原创 队列、栈、循环队列的java实现

设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。java中有Queue的接口,实现类为LinkedList。

2024-07-23 16:13:30 525

原创 链表入门题(链表反转,合并有序链表,链表相加,划分链表)

新链表是通过拼接给定的两个链表的所有节点组成的。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。,请你反转链表,并返回反转后的链表。的方式存储的,并且每个节点只能存储。,请你对链表进行分隔,使得所有。将两个升序链表合并为一个新的。给你一个链表的头节点。

2024-07-22 17:57:31 316

原创 二分搜索法

给定一个升序数组arr,并给出一个数num,求出这个数组中大于等于num的最左索引。要求时间复杂度为O(logn)。给定一个升序数组arr,并给出一个数num,求出这个数组中小于等于num的最右索引。给定一个升序数组arr,判断一个数num是否在这个升序数组中,要求时间复杂度为O(logn)。给你一个整数数组nums,找到峰值元素并返回其索引。需要使用二分搜索,若直接遍历时间复杂度为O(n),不符合要求,下面给出java代码。要求时间复杂度为O(logn),因此需要用二分查找法。

2024-07-18 16:43:20 376

原创 对数器——验证算法代码正确与否的手段

任何题型都可以自己用对数器验证,但需要熟练写出暴力解(一般为递归)。

2024-07-18 11:36:51 142

原创 选择、冒泡、插入排序

从下标2到n-1的位置,选择最小的数,放在2的位置,以此类推,直到排序完成。n-1,第 i 次选择就确定了下标为 i 的数字,因此最外层循环的范围是从0到n-2(确定了下标0到n-2,n-1自然就确定了)。时间复杂度:插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。第二次冒泡时,是在范围0-n-2中,确定下标n-2的数字,直到确定下标1的数字,结束循环,因为确定了下标n-1,n-2…

2024-07-17 18:03:09 260

原创 二进制与位运算

但对于整数最小值,一个数取反再加1就是他的相反数这个原则不适用,比如1000,表示-8,4位表示的最小的数就是-8,将1000取反加一还是1000,是-8本身,并不能得到8,这是因为4位只能表示正数-8~7,8不在这个范围中。区别2:通常来讲,||和&&的效率更高,比如,对于a&&b,a若位假,则不会判断b,直接返回假,但对于a&b,即使判断a为假后,也会判断b,下面用一个例子证明。对于负数,负数做>>运算,整体向右移动,左边用1补齐,负数做>>>运算,整体向右移动,左边用0补齐。

2024-07-16 15:41:11 737

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除