
Algorithm
文章平均质量分 70
DW算法
aJupyter
自然语言处理方向在读硕士生,优快云人工智能领域优质创作者,语雀知识库构建者,欢迎大家交流~
https://github.com/aJupyter
展开
-
215. 数组中的第K个最大元素
Problem: 215. 数组中的第K个最大元素文章目录思路解题过程复杂度Code思路快排的变形-》快速选择解题过程根据快排(排序默认从小到大)的性质,每次递归后pivot将数组划分为两个区间,左区间所有的元素<=pivot,右区间所有元素>=pivot,此时右区间所有元素均>左区间。如果此时k<=len(左区间),那么第k小的数从左区间找即可,直接递归左区间[l, j],否则递归右区间[j+1, r]。题目要求的是第k大的数,所以需要满足左区间所有元素>原创 2024-11-01 21:43:36 · 501 阅读 · 1 评论 -
18. 重建二叉树
返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。前序遍历是:[3, 9, 20, 15, 7]中序遍历是:[9, 3, 15, 20, 7]输入的前序遍历和中序遍历一定合法;树中节点数量范围 [0,100]。二叉树中每个节点的值都互不相同;二叉树的确立,使用dfs解决。原创 2024-10-31 21:16:04 · 319 阅读 · 0 评论 -
17. 从尾到头打印链表
输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。直接遍历链表,然后倒序输出结果数组即可。数据范围0≤链表长度 ≤1000。输入:[2, 3, 5]返回:[5, 3, 2]返回的结果用数组存储。原创 2024-10-31 20:36:13 · 305 阅读 · 0 评论 -
16. 替换空格
请实现一个函数,把字符串中的每个空格替换成"%20"。直接模拟,python string类具有天生优势。输出:“We%20are%20happy.”数据范围0≤输入字符串的长度 ≤1000。注意输出字符串的长度可能大于 1000。输入:“We are happy.”原创 2024-10-31 20:32:46 · 428 阅读 · 0 评论 -
15. 二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。利用性质:每一行从左到右递增,每一列从上到下递增,那么可以用右上角的元素来比较target。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。由于每次移动一行或者一列,最多移动m+n次,m和n分别代表列数和行数,当右上角>target,则往左移动,利用的是行的性质。当右上角原创 2024-10-31 20:21:56 · 229 阅读 · 0 评论 -
14. 不修改数组找出重复的数字
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。的数组nums,数组中所有的数均在 1∼n的范围内,其中 n≥1。思考题:如果只能使用 O(1)的额外空间,该怎么做呢?请找出数组中任意一个重复的数,但不能修改输入的数组。给定一个长度为 n+1。原创 2024-10-31 20:09:32 · 562 阅读 · 0 评论 -
13. 找出数组中重复的数字
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。的整数数组 nums,数组中所有的数字都在 0∼n−1。的范围内,或数组中不包含重复数字,则返回 -1;注意:如果某些数字不在 0∼n−1。请找出数组中任意一个重复的数字。原创 2024-10-31 19:37:56 · 583 阅读 · 0 评论 -
234. 回文链表
时间复杂度: O(n)O(n)O(n) 遍历一遍链表和元素列表空间复杂度: O(n)O(n)O(n) 元素列表原创 2024-05-18 21:47:09 · 448 阅读 · 0 评论 -
92. 反转链表 II
遍历到left前一个结点,反转[left, right]这一段区间当区间反转完毕后,p0(反转区间left的前一个结点,因为当left是head结点的时候,并无前一个结点,避免这种情况需要加一个虚结点)需要做相应的处理上图用于解释复杂度时间复杂度: O(n)O(n)O(n) 区间长度空间复杂度: O(1)O(1)O(1) 若干中间变量原创 2024-05-13 21:40:21 · 524 阅读 · 0 评论 -
206. 反转链表
两个指针 pre代表要指向的节点 cur代表当前的节点初始化pre=None,cur为head节点遍历链表的节点反复执行cur节点指向prepre指向curcur移动到下一个节点时间复杂度: O(n)O(n)O(n) 遍历一次链表空间复杂度: O(1)O(1)O(1) 若干中间变量递归https://leetcode.cn/problems/reverse-linked-list/solutions/2361282/206-fan-zhuan-lian-biao-shuang-zhi-zhen原创 2024-05-09 11:19:21 · 536 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II
这题最大的特点就是要删除所有重复的元素因为涉及到头节点是重复元素的情况,所以需要设置一个虚拟的头结点dummy利用cur代表当前位置的指针复杂度时间复杂度: O(n)O(n)O(n)空间复杂度: O(1)O(1)O(1)原创 2024-05-06 22:41:14 · 305 阅读 · 0 评论 -
102. 二叉树的层序遍历
时间复杂度: O(n)O(n)O(n) n个节点空间复杂度: O(n)O(n)O(n) 列表和队列原创 2024-05-05 15:48:18 · 385 阅读 · 1 评论 -
958. 二叉树的完全性检验
特点:对于一个完全二叉树,利用【层序遍历】进行宽度优先搜索,遇到第一个空节点遍历就结束了,后续遍历不会出现下一个非空节点可以利用该特点,判断遇到第一个空节点后还会不会遇到下一个非空节点如果能够遇到下一个空节点,则不是完全二叉树否则,是完全二叉树时间复杂度: O(n)O(n)O(n) n代表节点个数空间复杂度: O(n)O(n)O(n) 队列原创 2024-05-05 15:29:15 · 660 阅读 · 0 评论 -
83. 删除排序链表中的重复元素
时间复杂度: O(n)O(n)O(n) 遍历一遍链表空间复杂度: O(1)O(1)O(1) cur中间变量原创 2024-05-04 19:51:33 · 507 阅读 · 0 评论 -
718. 最长重复子数组
时间复杂度O(n∗m∗min(m,n))O(n*m*min(m, n))O(n∗m∗min(m,n)) n,m分别代表两个数组的长度空间复杂度O(1)O(1)O(1)滑动窗口暴力的问题是找到两个数组相等的位置需要花费大量的时间,这里面有重叠滑动窗口:将两个数组视为两把尺子,固定nums1,nums2的尾部与nums1的头部对齐,移动nums2直到nums2的头部与nums1的尾部对齐,每次滑动只需要计算两个数组重叠部分的子数组的最大公共数组长度即可。时间复杂度O(n+m)∗min(m,n))O(原创 2024-05-03 16:15:52 · 917 阅读 · 0 评论 -
76. 最小覆盖子串
注:这里用Counter()的比较大小来判断cnt_s是否覆盖cnt_t时间复杂度: O(Σm+n)O(Σm+n)O(Σm+n) 每个元素最多被遍历两次O(m)O(m)O(m),每次比较是O(Σ)O(Σ)O(Σ),这里ΣΣΣ代表字符串s元素的种类(本题最多为52)空间复杂度: O(n)O(n)O(n) 哈希表记录个数优化上述代码判断s的子串是否覆盖t,需要O(Σ)的时间复杂度,可以优化成O(1)思路:用less代表s的子串没有覆盖t的字母的种类,扩大窗口(通过移动r)减小res,当less为0的时候,原创 2024-05-02 19:15:06 · 965 阅读 · 1 评论 -
209. 长度最小的子数组
时间复杂度: O(n)O(n)O(n) 数组元素最多遍历两次空间复杂度: O(1)O(1)O(1)原创 2024-05-01 22:40:47 · 544 阅读 · 0 评论 -
3. 无重复字符的最长子串
时间复杂度: O(n)O(n)O(n) 每个元素最多遍历两次空间复杂度: O(n)O(n)O(n) 哈希表原创 2024-04-28 21:39:34 · 573 阅读 · 0 评论 -
239. 滑动窗口最大值
时间复杂度: O(nlog2n)O(nlog_2n)O(nlog2n)空间复杂度: O(n)O(n)O(n)时间复杂度: O(n)O(n)O(n) 所有元素最多会遍历2次空间复杂度: O(n)O(n)O(n)原创 2024-04-28 20:09:10 · 275 阅读 · 0 评论 -
155. 最小栈
借助辅助栈min_stk(栈顶即栈中的最小值)来存储栈中的最小元素:时间复杂度: O(n1)O(n1)O(n1) 压栈、出栈、获取栈顶、获取栈中最小值时间复杂度均为O(n1)O(n1)O(n1)空间复杂度: O(n)O(n)O(n) 用以辅助的min_stk栈原创 2024-04-26 11:05:06 · 411 阅读 · 0 评论 -
415. 字符串相加
具体步骤为:需要注意,Python,list的join方法只能将元素是字符的列表拼接成字符串。如果需要删除前导0,则需要删除列表后面的0(最多保留一个,模拟结果相加为0的情况)复杂度时间复杂度: O(n)O(n)O(n)空间复杂度: O(n)O(n)O(n)原创 2024-04-24 12:51:25 · 436 阅读 · 0 评论 -
240. 搜索二维矩阵 II
由于行和列都是有序的,所以可以考虑二分查找,也可以分为两种方法时间复杂度: O(min(n,m)logn)O(min(n,m)logn)O(min(n,m)logn)空间复杂度: O(1)O(1)O(1)原创 2024-04-23 15:27:44 · 1226 阅读 · 0 评论 -
4. 寻找两个正序数组的中位数
中位数把大的数组均分为两份,记合并后的有序数组nums长度为n:当确定nums1中的元素为m1时候,那么nums2中的元素只需要确定k-m1个,就可以找到中位数。此时问题变为了,如何从nums1中寻找m1的位置=》【二分查找】令指针l、r分别指向nums1的起始和nums的末尾m1=l+r>>1m2=k-m1最终就可以得到nums1的个数m1=lnums2的个数为m2=k-c1接下来就是判断长度为奇偶和处理边界时间复杂度: O(log2(m+n))O(log_2(m+n))O(log2(m+n))原创 2024-04-22 20:25:40 · 490 阅读 · 0 评论 -
162. 寻找峰值
时间复杂度: O(logn)O(logn)O(logn) 二分查找空间复杂度: O(1)O(1)O(1) 若干中间变量原创 2024-04-20 21:56:12 · 557 阅读 · 0 评论 -
33. 搜索旋转排序数组
同理时间复杂度: O(logn)O(logn)O(logn) 一次二分查找空间复杂度: O(1)O(1)O(1) 若干中间变量原创 2024-04-16 19:42:29 · 627 阅读 · 0 评论 -
153. 寻找旋转排序数组中的最小值
当数组旋转后,只有可能出现如图的两种情况(原数组或者左边比右边大的数组)情况1的最小值在最左端,情况二的最小值是两端的最小值之一取左右端点分别为l, r = 0, n - 1mid为中点当出现nums[mid] > nums[r]时,只有可能出现在情况2,此时最小值在右区间当nums[mid]原创 2024-04-15 19:50:17 · 803 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
时间复杂度: O(logn)O(logn)O(logn) 二次两份查找空间复杂度: O(1)O(1)O(1) 若干中间变量原创 2024-04-15 19:09:08 · 474 阅读 · 0 评论 -
704. 二分查找
时间复杂度: O(log2n)O(log_2n)O(log2n) 每次都折半空间复杂度: O(1)O(1)O(1) 若干中间变量原创 2024-04-15 18:18:40 · 558 阅读 · 0 评论 -
179. 最大数
时间复杂度: O(nlogn,n)O(nlogn, n)O(nlogn,n) = O(nlogn)O(nlogn)O(nlogn) 排序和数组字符串化空间复杂度: O(n)O(n)O(n) 字符串列表的空间原创 2024-04-14 11:56:53 · 495 阅读 · 0 评论 -
56. 合并区间
1.定义一个结果数组ans,先按照所有区间的左端点进行排序2.遍历所有区间i,将第一个区间放入ans中3.依次遍历后续的区间i,判断每个区间与ans中最后一个区间的关系(是否重叠,依据为区间i的左区间是否>ans最后一个区间的右区间:不重叠,其余情况为重叠)-如果不重叠就将当前区间放入ans中-如果重叠需要判断当前区间的右端点和区间i的右端点的大小关系,更新当前区间的右端点为两者的较大值4.返回ans时间复杂度: O(n)O(n)O(n) 遍历一遍数组空间复杂度: O(n)O(n)O(n) 答案数原创 2024-04-13 23:18:52 · 334 阅读 · 0 评论 -
136. 只出现一次的数字
时间复杂度: O(n)O(n)O(n)空间复杂度: O(1)O(1)O(1)原创 2024-04-12 10:54:53 · 362 阅读 · 0 评论 -
0169. 多数元素
参考K神学会摩尔投票法这个方法思想很简单,就是模拟投票,且正负票抵消。在本题中,首先假定一个多数元素,遍历元素,如果元素等于多数元素啧票数加1,否则减一。初始化:vetoes=0:票数, x=-1:多数元素依次遍历元素,如果元素等于x,则票数加1,即vetoes+=1否则,票数减1,即vetoes-=1当票数为0时,x就是当前遍历到的元素。返回最后一个x即可。时间复杂度: O(n)O(n)O(n) 一次遍历空间复杂度: O(1)O(1)O(1) vetoes和x中间变量原创 2024-04-11 10:23:16 · 910 阅读 · 0 评论 -
88. 合并两个有序数组
时间复杂度: O(n+m)O(n + m)O(n+m) 遍历两个数组空间复杂度: O(1)O(1)O(1) 指针变量原创 2024-04-10 11:13:04 · 879 阅读 · 0 评论 -
912. 排序数组
时间复杂度:O(nlogn)O(nlogn)O(nlogn) 执行了2∗logn2*logn2∗logn次的递归 每一次都需要遍历整个数组空间复杂度:O(n)O(n)O(n) 递归2∗logn2*logn2∗logn次,所以需要O(logn)O(logn)O(logn)的栈调用空间,所有的递归总共需要O(n)O(n)O(n)的辅助空间,所以总的空间复杂度为O(n+logn)O(n + logn)O(n+logn) = O(n)O(n)O(n)image.png原创 2024-04-09 12:58:55 · 684 阅读 · 0 评论 -
215. 数组中的第K个最大元素
时间复杂度: O(N)O(N)O(N) 只需要递归一半,也就是递归搜索树的一条链,线性的空间复杂度: O(logN)O(logN)O(logN) 递归栈的开销,一共递归了logNlogNlogN次原创 2024-04-07 13:04:22 · 489 阅读 · 0 评论 -
48. 旋转图像
思路二可以发现A被覆盖掉了,所以可以用临时变量temp存储思路三通过观察可以得出:原矩阵可以通过一次「水平翻转」+「主对角线翻转」得到旋转后的二维矩阵。解题方法复杂度时间复杂度: O(n2)O(n^2)O(n2) 两重循环空间复杂度: O(1)O(1)O(1) 一个临时变量原创 2024-04-05 18:42:03 · 444 阅读 · 0 评论 -
54. 螺旋矩阵
时间复杂度: O(m∗n)O(m * n)O(m∗n) 矩阵每个元素只遍历一次空间复杂度: O(m∗n)O(m * n)O(m∗n) 矩阵元素个数原创 2024-04-04 11:09:22 · 431 阅读 · 0 评论