算法(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.pswp.cn/news/444863.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444863.shtml
英文地址,請注明出處:http://en.pswp.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;以…