算法
hunter95671
这个作者很懒,什么都没留下…
展开
-
从上到下打印二叉树(三)
题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7返回其层次遍历结果:[[3],[20,9],[15,7]]算法流程:1.特例处理: 当树的根节点为空,则直接返回空列表 [] ;2.初始化: 打印结果空列表 res3.BFS 循环: 当 deque 为空时跳出;原创 2021-11-21 10:06:19 · 728 阅读 · 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 · 101 阅读 · 0 评论 -
从上到下打印二叉树(一)
题目描述从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。算法流程:题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。1.特例处理: 当树的根节点为空,则直接返回空列表 [] ;2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;3.BFS 循环: 当队列 queue 为空时跳出;1.出队: 队首元素出队,记为 node;2.打印: 将 no原创 2021-11-13 15:44:39 · 131 阅读 · 0 评论 -
算法题-环形链表
题目描述:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。算法流程:我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置原创 2021-11-07 17:00:55 · 74 阅读 · 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 · 65 阅读 · 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 · 52 阅读 · 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 · 47 阅读 · 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 · 49 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。算法流程:辅助栈法:入栈: 遍历链表,将各节点值 push 入栈。(Python 使用 append() 方法,Java借助 LinkedList 的addLast()方法)。出栈: 将各节点值 pop 出栈,存储于数组并返回。(Python 直接返回 stack 的倒序列表,Java 新建一个数组,通过 popLast() 方法将各元素存入数组,实现倒序输出)。代码:class Solution {原创 2021-10-16 08:58:55 · 44 阅读 · 0 评论 -
翻转单词顺序
题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。算法流程:栈法:从最后一个字符开始,遇到单词则入栈,遇到空格或第一个字符都要检查一下栈中是否有单词可以弹出,若有则全部弹出并拼接,每弹出一个完整的单词就添加一个空格代码:class Solution {public: string reverseWords(string s) {原创 2021-10-13 20:09:18 · 59 阅读 · 0 评论 -
和为S的连续正式序列
题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。算法流程:在这道题中,我们关注的是滑动窗口中所有数的和。当滑动窗口的右边界向右移动时,也就是 j = j + 1,窗口中多了一个数字 j,窗口的和也就要加上 j。当滑动窗口的左边界向右移动时,也就是 i = i + 1,窗口中少了一个数字 i,窗口的和也就要减去 i。滑动窗口只有 右边界向右移动(扩大窗口) 和 左边界向右移动(缩小窗口)原创 2021-10-12 17:39:25 · 41 阅读 · 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 · 62 阅读 · 0 评论 -
栈的压入弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。算法流程:考虑借用一个辅助栈 stack ,模拟 压入 / 弹出操作的排列。根据是否模拟成功,即可得到结果。入栈操作: 按照压栈序列的顺序执行。出栈操作: 每次入栈后,循环判断 “栈顶元素 = 弹出序列的当前元素”原创 2021-10-10 15:03:04 · 64 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。算法流程:维护两个栈,第一个栈支持插入操作,第二个栈支持删除操作。根据栈先进后出的特性,我们每次往第一个栈里插入元素后,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个待删除的元素。为了维护队列先进先出的特性,我们引入第二个栈,用第二个栈维护待删除的元素,在执行删除操作的时候我们首先看下第二个栈是否为空。如果为空,我们将第一个栈里的元素一个个弹出插入到第二个栈里,这样第二个栈里元素的顺序就是待删除的元素的顺序,要执原创 2021-10-06 14:45:10 · 57 阅读 · 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 · 79 阅读 · 0 评论 -
顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。算法流程:1.空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。2.初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。3.循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事 (各方向的具体信息见下表) ;(1)、根据边界打印,即将元素按顺序添加至列表 res 尾部;(2)、边界向内收缩 1 (代表已被打印);(原创 2021-09-16 19:13:27 · 49 阅读 · 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 · 111 阅读 · 0 评论 -
算法题-数组中重复数字
题目描述在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。解题思路:方法一:哈希表 / Set利用数据结构特点,容易想到使用哈希表(Set)记录数组的各个数字,当查找到重复数字则直接返回。算法流程:初始化: 新建 HashSet ,记为 dicdicdic ;遍历数组 numsnumsnums 中的每个数字 numnumnum :当 numnumnum 在 dic原创 2021-09-12 09:26:17 · 84 阅读 · 0 评论