算法(19)-leetcode-剑指offer3

leetcode-剑指offer-3

  • 21.面试题22-链表中的倒数第k个节点
  • 22.面试题24-反转链表
  • 23.面试题25-合并两个排序链表-递归
  • 24.面试题26-树的子结构
  • 25.面试题27-二叉树的镜像
  • 26.面试题28-对称二叉树
  • 27.面试题29-顺时针打印矩阵
  • 28.面试题30-包含min函数的栈
  • 29.面试题31-栈的押入,弹出序列
  • 30.面试题32-1-从上到下打印二叉树
  • 31.面试题32-2-从上到下打印二叉树
  • 32.面试题32-3-从上到下打印二叉树

本系列博文为题库刷题笔记,(仅在督促自己刷题)如有不详之处,请参考leetcode官网:https://leetcode-cn.com/problemset/lcof/
172/1645-184/1645

编程语言为python

21.面试题22-链表中的倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
双指针技巧,没要求删除节点,所以不需要设置哑节点

class Solution(object):def getKthFromEnd(self, head, k):""":type head: ListNode:type k: int:rtype: ListNode"""if head==None:return headp1=headfor _ in range(k): # 1:[0,k-1]p1=p1.nextp2=headwhile(p1):p1=p1.nextp2=p2.nextreturn p2

22.面试题24-反转链表

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def reverseList(self, head):""":type head: ListNode:rtype: ListNode"""if head==None or head.next==None:return headpre_node=Nonecur_node=headwhile(cur_node):next_node=cur_node.nextcur_node.next=pre_nodepre_node=cur_nodecur_node=next_nodereturn pre_node

23.面试题25-合并两个排序链表-递归

迭代:新建一个头节点,用归并方法比较连个排序链表对应节点,用较小的节点值 创建新的节点;更新比较节点。
递归:

class Solution(object):def mergeTwoLists(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""if l1==None:return l2if l2==None:return l1if l1.val<=l2.val:l1.next=self.mergeTwoLists(l1.next,l2)return l1else:l2.next=self.mergeTwoLists(l1,l2.next)return l2

24.面试题26-树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。

深度优先遍历,比较各个节点。

A的每一个节点都可能是B的根节点,因此:
需要对A的每一个节点进行先序遍历–isSubStructure(A,B)
以A每一个节点为根节点的子树是否包含树B-- dfs(node1,node2)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def isSubStructure(self, A, B):""":type A: TreeNode:type B: TreeNode:rtype: bool"""def dfs(node1,node2):if node2==None:return Trueif node1==None or node1.val!=node2.val:return Falsereturn dfs(node1.left,node2.left) or dfs(node1.right,node2.right) return bool(A and B) and (dfs(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B))

25.面试题27-二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。
深度优先遍历?
单个节点要作的操作:交换左右子树,对两个子树进行相同的操作。

class Solution(object):def mirrorTree(self, root):""":type root: TreeNode:rtype: TreeNode"""def dfs(node):if node==None:returnnode.left,node.right=node.right,node.leftdfs(node.left)dfs(node.right)return nodereturn dfs(root)

26.面试题28-对称二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
迭代解法:

class Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""que=[(root,root)]while(que):node1,node2=que.pop(0)if node1==None and node2==None:continueif node1==None or node2==None:return Falseif node1.val!=node2.val:return Falseque.append((node1.left,node2.right))que.append((node1.right,node2.left))return True

自底向上的递归:子树给父亲提供信息

class Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""def isSymmetric_bottom_up(node1,node2):if node1==None and node2==None:return Trueif node1==None or node2==None:return Falsereturn node1.val==node2.val and isSymmetric_bottom_up(node1.left,node2.right) and isSymmetric_bottom_up(node1.right,node2.left)return isSymmetric_bottom_up(root,root)

27.面试题29-顺时针打印矩阵

有一个控制方向的列表

class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""m=len(matrix)if m==0:return []n=len(matrix[0])visited_mat=[[True]*n for _ in range(m)]dr=[0,1,0,-1]dc=[1,0,-1,0]di=0r,c=0,0res=[]for _ in range(m*n):res.append(matrix[r][c])visited_mat[r][c]=Falsenext_r,next_c=r+dr[di],c+dc[di] # 控制横纵坐标的增减# print(r,c,next_r,next_c)if 0<=next_r<m and 0<=next_c<n and visited_mat[next_r][next_c]:r=next_rc=next_celse:di=(di+1)%4r,c=r+dr[di],c+dc[di]return res

28.面试题30-包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
min 函数,时间复杂度要求是o(1),要么存一个元素,要么放在辅助栈的栈顶或栈底,维护一个元素在连续弹出元素的时候无法o(1)时间更新最小值。

所以需要维护以个辅助栈,辅助栈栈顶存最小元素。
当push val时,将val与辅助栈栈顶元素对比:如果更小就Push进辅助栈栈顶 ;如果更大就复制一份栈顶元素;
当pop元素时,两个栈同时pop()就可以了。

class MinStack(object):def __init__(self):"""initialize your data structure here."""self.main_stack=[]self.help_stack=[]self.size=0def push(self, x):""":type x: int:rtype: None"""if self.size==0:self.size+=1self.main_stack.append(x)self.help_stack.append(x)else:self.size+=1self.main_stack.append(x)if self.help_stack[-1]>x:self.help_stack.append(x)else:self.help_stack.append(self.help_stack[-1])def pop(self):""":rtype: None"""if self.size==0:returnelse:self.size-=1self.help_stack.pop()return self.main_stack.pop()def top(self):""":rtype: int"""if self.size==0:return else:return self.main_stack[-1]def min(self):""":rtype: int"""if self.size==0:returnelse:return self.help_stack[-1]

29.面试题31-栈的押入,弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

使用一个辅助栈来帮助实现判断:
入栈:按照压栈序列顺序执行,每次入栈后,判断栈顶元素和弹出序列的当前元素是否一致,一致的话,执行弹出操作。不断重复,如果能够遍历完两个序列,说明两者是栈的押入和弹出序列:

class Solution(object):def validateStackSequences(self, pushed, popped):""":type pushed: List[int]:type popped: List[int]:rtype: bool"""help_stack=[]i=0for val in pushed:help_stack.append(val)while(help_stack and help_stack[-1]==popped[i]):help_stack.pop()i+=1return not help_stack

30.面试题32-1-从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。结果放在一个list中。
思路:二叉树的层次遍历。迭代-没有level的控制,一直押入弹出就可以。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[int]"""if root==None:return []res=[]que=[root]while(que):node=que.pop(0) # 不加可以么res.append(node.val)if node.left:que.append(node.left)if node.right:que.append(node.right)return res

31.面试题32-2-从上到下打印二叉树

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
思路:二叉树的层次遍历。迭代,维护每一层的节点在同一个循环中输出。

class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []res=[]que=[root]while(que):n=len(que)res.append([])for i in range(n):node=que.pop(0)res[-1].append(node.val)if node.left:que.append(node.left)if node.right:que.append(node.right)return res

递归:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""def bfs(node,level):if node==None:returnif level>len(res)-1:res.append([])res[level].append(node.val)bfs(node.left,level+1)bfs(node.right,level+1)res=[]bfs(root,0) # 如果root为空会直接返回return res

32.面试题32-3-从上到下打印二叉树

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
最直接的办法:依据上一题的解题思路,只是在奇数层的时候将res[l]内容逆序操作以下。

class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []res=[]que=[root]while(que):n=len(que)tmp=[]for i in range(n):node=que.pop(0)tmp.append(node.val)if node.left:que.append(node.left)if node.right:que.append(node.right)if len(res)%2==1:res.append(tmp[::-1])else:res.append(tmp)return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高效解析xml的总结,闲下来写的

需要这么几个库&#xff0c;直接放在你的代码工程里即可&#xff1a; #include "rapidxml.h" #include "rapidxml_utils.h" int ReBornBossConf::loadConf(const char* szFileName){ rapidxml::file<char> fdoc(szFileName); rapidxml::xml_docum…

leetcode35 插入的位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 思路&#xff1a;二分查找 public class Solution {public int searchInsert(i…

算法(20)-leetcode-剑指offer4

leetcode-剑指offer-433.面试题33-二叉搜索树的后序遍历序列34.面试题34-二叉树中和为某一值的路径35.面试题35-复杂链表的复制36.面试题36-二叉搜索树与双向链表37.面试题37-序列化二叉树38.面试题38-字符串的排列39.面试题39-数组中出现次数超过一半的数字40.面试题40-最小的…

关于linux的进程中的各个线程cpu占用情况的分析和查看

我们经常会在新开的服搭建一个游戏的服务器,有时候要进行压力测试,那么如何来看呢,一般我们会通过top命令查看各个进程的cpu和内存占用情况,获得到了我们的进程id,然后我们也许会通过pstack命令查看里边的各个线程id以及对应的线程现在正在做什么事情,分析多组数据就可以…

算法(21)-leetcode-剑指offer5

leetcode-剑指offer-443.面试题43-1&#xff5e;n整数中1出现的次数44.面试题44-数字序列中某一位的数字45.面试题45-把数组排成最小的数-快排变种46.面试题46-把数字翻译成字符串47.面试题47-礼物的最大价值-dp48.面试题48-最长不含重复字符的子字符串-滑动窗口法49.面试题49-…

游戏中DDA算法和Bresenham算法的应用

在角色扮演或即时战略游戏中,经常会将角色以最佳的方式走到指定地点。游戏场景的地面情况复杂,而且场面大,若采用盲目式搜索,例如盲目穷举法,则几乎要遍历整个场景,效率非常低,造成角色反应速度过慢,实践证明是一种不适合网络游戏寻路方法。而启发式搜索算法在障碍较少的情况下…

leetcode7 整数反转

给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能存储得下 32 位的有符号整数&#xff0c;则其数值范围为 [−231, …

关于苹果purchase的验证

用户在购买苹果的商品的过程如下:

算法(23)-leetcode-剑指offer7

leetcode-剑指offer-559.面试题59-队列的最大值60.面试题64-求12...n61.面试题65-不用加减乘除做加法62.面试题66-构建乘积数组63.面试题68-1二叉树搜索树的最近公共祖先64.面试题68-2二叉树的最近公共祖先65.面试题67-把字符串转换成数字-自动机66.面试题20-表示数值的字符串-…

C/C++ 获得公网ip地址和内网ip

获得公网ip:bool getPublicIp(string& ip) {int sock;char **pptr = NULL;struct sockaddr_in destAddr;struct hostent *ptr = NULL;char destIP[128];sock = socket(AF_INET,SOCK_STREAM,0);if( -1 == sock ){perror("creat socket failed");return …

终于,我读懂了所有Java集合——List篇

ArrayList 基于数组实现&#xff0c;无容量的限制。 在执行插入元素时可能要扩容&#xff0c;在删除元素时并不会减小数组的容量&#xff0c;在查找元素时要遍历数组&#xff0c;对于非null的元素采取equals的方式寻找。 是非线程安全的。 注意点&#xff1a; &#xff08…

关于长连接和短连接

短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

C++(8)--数组array-长度固定

数组及常用算法1.数组基本概念2.一维数组2.1数组的定义2.2数组初始化2.3一维数组动态赋初值2.4一维数组应用实例2.5一维数组的排序算法2.6 一维数组元素的删除和插入array3.二维数组3.1数组定义3.2二维数组的动态赋值《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》…

关于去苹果服务器验证充值的一些看法

前端时间看了下关于app充值验证发送游戏金币的好多帖子和文章,也总结了一下app校验的php代码:可以参考我的上一封博客: http://blog.csdn.net/pbymw8iwm/article/details/42167125 其中这个帖子回复的大神比较多:点击打开链接 有些人认为拿苹果的receptdata去验证,通过返…

终于,我读懂了所有Java集合——queue篇

Stack 基于Vector实现&#xff0c;支持LIFO。 类声明 public class Stack<E> extends Vector<E> {} push public E push(E item) {addElement(item);return item; } pop public synchronized E pop() {E obj;int len size();obj peek();removeElementAt(…

IAP-应用内购买流程

成为ios开发者最大的好处就是&#xff0c;你编写的应用程序会有很多方式可以赚钱。比如&#xff0c;收费版&#xff0c;免费挂广告版&#xff0c;还有就是程序内置购买。 程序内置购买会让你爱不释手&#xff0c;主要有以下原因&#xff1a; 除了程序本身的下载收费以外&#x…

C++(8.5)--Vector容器

向量容器Vector1. 定义/初始化2. 遍历3. 常用操作vector 迭代器遍历&#xff0c;sort, reverse,1. 定义/初始化 vector是同一类型对象的集合&#xff0c;被称作容器。vector实际是一个类模版&#xff0c;可用于保存多种数据类型的数据&#xff08;确定类型的vector 就只能装同…

关于mysql的change和modify

前端时间要写个游戏里的邮件系统&#xff0c;定义了一个如下的表结构&#xff1a; CREATE TABLE sysmail (mailid int(20) NOT NULL AUTO_INCREMENT,sendtime int(11) NOT NULL DEFAULT 0,mailtitle varchar(512) COLLATE utf8_bin NOT NULL DEFAULT ,mailcontext varchar(2048…

终于,我读懂了所有Java集合——map篇

首先&#xff0c;红黑树细节暂时撸不出来&#xff0c;所以没写&#xff0c;承诺年前一定写 HashMap &#xff08;底层是数组链表/红黑树&#xff0c;无序键值对集合&#xff0c;非线程安全&#xff09; 基于哈希表实现&#xff0c;链地址法。 loadFactor默认为0.75&#xff0…

valgrind工具使用详解

zz自 http://blog.csdn.net/destina/article/details/6198443 感谢作者的分享&#xff01; 一 valgrind是什么&#xff1f; Valgrind是一套Linux下&#xff0c;开放源代码&#xff08;GPL V2&#xff09;的仿真调试工具的集合。Valgrind由内核&#xff08;core&#xff09;以…