算法
hunter95671
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
从上到下打印二叉树(三)
题目描述: 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [20,9], [15,7] ] 算法流程: 1.特例处理: 当树的根节点为空,则直接返回空列表 [] ; 2.初始化: 打印结果空列表 res 3.BFS 循环: 当 deque 为空时跳出;原创 2021-11-21 10:06:19 · 794 阅读 · 0 评论 -
从上到下打印二叉树(二)
题目描述 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 算法流程: 1.特例处理: 当根节点为空,则返回空列表 [] ; 2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ; 3.BFS 循环: 当队列 queue 为空时跳出; 1.新建一个临时列表原创 2021-11-18 18:23:20 · 162 阅读 · 0 评论 -
从上到下打印二叉树(一)
题目描述 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 算法流程: 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。 BFS 通常借助 队列 的先入先出特性来实现。 1.特例处理: 当树的根节点为空,则直接返回空列表 [] ; 2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ; 3.BFS 循环: 当队列 queue 为空时跳出; 1.出队: 队首元素出队,记为 node; 2.打印: 将 no原创 2021-11-13 15:44:39 · 197 阅读 · 0 评论 -
算法题-环形链表
题目描述: 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 如果链表中存在环,则返回 true 。 否则,返回 false 。 算法流程: 我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置原创 2021-11-07 17:00:55 · 138 阅读 · 0 评论 -
两个链表的第一个公共节点
题目描述: 输入两个链表,找出它们的第一个公共节点。 算法流程: 构建两个节点指针 A , B 分别指向两链表头节点 headA , headB ,做如下操作: 指针 A 先遍历完链表 headA ,再开始遍历链表 headB ,当走到 node 时,共走步数为: a+(b−c) 指针 B 先遍历完链表 headB ,再开始遍历链表 headA ,当走到 node 时,共走步数为: b+(a−c) 如下式所示,此时指针 A , B 重合,并有两种情况: a+(b−c)=b+(a−c) 若两链表 有 公共尾原创 2021-10-28 18:37:58 · 129 阅读 · 0 评论 -
合并两个排序的链表
题目描述: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 算法流程: 1.初始化: 伪头节点 dum ,节点 cur 指向 dum 。 2.循环合并: 当 l1 或 l2为空时跳出; 1.当 l1.val<l2.val 时: cur的后继节点指定为 l1,并 l1 向前走一步; 2.当 l1.val≥l2.val时: cur的后继节点指定为 l2 ,并 l2向前走一步 ; 3.节点 cu向前走一步,即 cur=cur.next。 3.合并剩余尾部: 跳出时有两种情况,即原创 2021-10-25 16:09:05 · 99 阅读 · 0 评论 -
链表的反转
题目描述: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 算法流程: 迭代(双指针) 考虑遍历链表,并在访问各节点时修改 next 引用指向,算法流程见注释。 代码: class Solution { public ListNode reverseList(ListNode head) { ListNode cur = head, pre = null; while(cur != null) { ListNode t原创 2021-10-22 18:36:47 · 92 阅读 · 0 评论 -
删除链表节点
题目描述 删除链表节点 算法流程: 1.特例处理: 当应删除头节点 head 时,直接返回 head.next 即可。 2.初始化: pre = head , cur = head.next 。 3.定位节点: 当 cur 为空 或 cur 节点值等于 val 时跳出。 保存当前节点索引,即 pre = cur 。 遍历下一节点,即 cur = cur.next 。 4.删除节点: 若 cur 指向某节点,则执行 pre.next = cur.next ;若 cur 指向 null,代表链表中不包含值为 v原创 2021-10-18 18:54:58 · 110 阅读 · 0 评论 -
从尾到头打印链表
题目描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 算法流程: 辅助栈法: 入栈: 遍历链表,将各节点值 push 入栈。(Python 使用 append() 方法,Java借助 LinkedList 的addLast()方法)。 出栈: 将各节点值 pop 出栈,存储于数组并返回。(Python 直接返回 stack 的倒序列表,Java 新建一个数组,通过 popLast() 方法将各元素存入数组,实现倒序输出)。 代码: class Solution {原创 2021-10-16 08:58:55 · 94 阅读 · 0 评论 -
翻转单词顺序
题目描述 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。 算法流程: 栈法: 从最后一个字符开始,遇到单词则入栈,遇到空格或第一个字符都要检查一下栈中是否有单词可以弹出,若有则全部弹出并拼接,每弹出一个完整的单词就添加一个空格 代码: class Solution { public: string reverseWords(string s) {原创 2021-10-13 20:09:18 · 98 阅读 · 0 评论 -
和为S的连续正式序列
题目描述 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 算法流程: 在这道题中,我们关注的是滑动窗口中所有数的和。当滑动窗口的右边界向右移动时,也就是 j = j + 1,窗口中多了一个数字 j,窗口的和也就要加上 j。当滑动窗口的左边界向右移动时,也就是 i = i + 1,窗口中少了一个数字 i,窗口的和也就要减去 i。滑动窗口只有 右边界向右移动(扩大窗口) 和 左边界向右移动(缩小窗口)原创 2021-10-12 17:39:25 · 89 阅读 · 0 评论 -
和为S的两个数字
题目描述 在有序数组中找出两个数,使得和为给定的数 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。 算法流程: 初始化: 双指针 i , j 分别指向数组 nums 的左右两端 (俗称对撞双指针)。 循环搜索: 当双指针相遇时跳出; 计算和 s=nums[i]+nums[j]; 若 s>targets ,则指针 j 向左移动,即执行 j=j−1 ; 若 s<targets ,则指针 i 向右移动,即执行 i=i+1 ; 若 s=targets ,立即返回数组 [nums[i], num原创 2021-10-11 21:07:25 · 120 阅读 · 0 评论 -
栈的压入弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。 算法流程: 考虑借用一个辅助栈 stack ,模拟 压入 / 弹出操作的排列。根据是否模拟成功,即可得到结果。 入栈操作: 按照压栈序列的顺序执行。 出栈操作: 每次入栈后,循环判断 “栈顶元素 = 弹出序列的当前元素”原创 2021-10-10 15:03:04 · 128 阅读 · 0 评论 -
用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 算法流程: 维护两个栈,第一个栈支持插入操作,第二个栈支持删除操作。 根据栈先进后出的特性,我们每次往第一个栈里插入元素后,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个待删除的元素。为了维护队列先进先出的特性,我们引入第二个栈,用第二个栈维护待删除的元素,在执行删除操作的时候我们首先看下第二个栈是否为空。如果为空,我们将第一个栈里的元素一个个弹出插入到第二个栈里,这样第二个栈里元素的顺序就是待删除的元素的顺序,要执原创 2021-10-06 14:45:10 · 114 阅读 · 0 评论 -
第一个只出现一次的字符位置
题目描述 在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。 算法流程: 1.初始化: 字典 (Python)、HashMap(Java)、map(C++),记为 dic ; 2.字符统计: 遍历字符串 s 中的每个字符 c ; 若 dic 中 不包含 键(key) c :则向 dic 中添加键值对 (c, True) ,代表字符 c 的数量为 1 ; 若 dic 中 包含 键(key) c :则修改键 c 的键值对为 (c, False) ,代表字符 c 的数量原创 2021-10-04 16:22:21 · 128 阅读 · 0 评论 -
顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 算法流程: 1.空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。 2.初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。 3.循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事 (各方向的具体信息见下表) ; (1)、根据边界打印,即将元素按顺序添加至列表 res 尾部; (2)、边界向内收缩 1 (代表已被打印); (原创 2021-09-16 19:13:27 · 101 阅读 · 0 评论 -
二维数组中的查找
题目描述 给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。 算法流程: 从矩阵 matrix 左下角元素(索引设为 (i, j) )开始遍历,并与目标值对比: 当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素; 当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素; 当 matrix[i][j] = target 时,返回 truetruetrue ,代表找到目原创 2021-09-14 16:09:44 · 252 阅读 · 0 评论 -
算法题-数组中重复数字
题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 解题思路: 方法一:哈希表 / Set 利用数据结构特点,容易想到使用哈希表(Set)记录数组的各个数字,当查找到重复数字则直接返回。 算法流程: 初始化: 新建 HashSet ,记为 dicdicdic ; 遍历数组 numsnumsnums 中的每个数字 numnumnum : 当 numnumnum 在 dic原创 2021-09-12 09:26:17 · 142 阅读 · 0 评论
分享