LeetCode 題解2 (Python)

本文轉(zhuǎn)載自作業(yè)部落chanvee.

Same Tree


這個(gè)題的意思非常簡(jiǎn)單,給定兩顆二叉樹幌羞,判斷這兩顆二叉樹是否相同悠夯。樹相同包括兩點(diǎn):一是結(jié)構(gòu)相同癌淮,而是值相同。因此我們只需要對(duì)兩棵樹同時(shí)遍歷)(簡(jiǎn)單的遞歸)一遍沦补,遇到不同(結(jié)構(gòu)不同或者值不同)時(shí)則返回False乳蓄;若遍歷一遍之后沒有發(fā)現(xiàn)不同則說明這兩棵樹相同。代碼如下:

# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # @param p, a tree node
    # @param q, a tree node
    # @return a boolean
    def isSameTree(self, p, q):  
        if p == None and q == None:
            return(True)
        elif p == None or q == None:
            return(False)
        else:
            if p.val != q.val:
                return(False)
            else:  
                if self.isSameTree(p.left, q.left): 
                    return(self.isSameTree(p.right, q.right))
                else:
                    return(False) 

Symmetric Tree


這個(gè)題是判斷一棵樹是不是對(duì)稱樹夕膀。我們可以根據(jù)上一個(gè)題來解決這個(gè)問題虚倒,先給代碼:

# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # @param root, a tree node
    # @return a boolean
    def isSymmetric(self, root):
        if root == None:
            return(True)
        else:
            return(self.isSameTree(root.left, root.right))
    def isSameTree(self, p, q):
        if p == None and q == None:
            return(True)
        elif p == None or q == None:
            return(False)
        else:
            if p.val != q.val:
                return(False)
            else:
                if self.isSameTree(p.left, q.right): 
                    return(self.isSameTree(p.right, q.left))
                else:
                    return(False) 

有代碼可知,我們首先把這個(gè)樹分成左右兩顆子樹店诗,然后遍歷這兩顆子樹裹刮,比較時(shí)不再是左邊和左邊的比,因?yàn)閷?duì)稱庞瘸,所以比較左子樹的左節(jié)點(diǎn)和右子樹的右節(jié)點(diǎn)以及左子樹的右節(jié)點(diǎn)和右子樹的左節(jié)點(diǎn)是否相等即可捧弃。

Add Two Numbers


這個(gè)題目是實(shí)現(xiàn)鏈表的加法,剛開始理解錯(cuò)了擦囊,看到題目給的例子以為給的兩個(gè)列表長(zhǎng)度是相等的违霞,其實(shí)不是哈,不一定等長(zhǎng)瞬场。題目本身很簡(jiǎn)單买鸽,值得一提的是python中鏈表的操作,才開始我硬是沒搞清楚贯被,先貼代碼:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # @return a ListNode
    def addTwoNumbers(self, l1, l2):
        add = 0
        l3 = ListNode(0)
        cur = l3
        while l1 or l2:
            node = ListNode(add)
            if l1:
                node.val += l1.val
                l1 = l1.next
            if l2:
                node.val += l2.val
                l2 = l2.next
            if node.val >= 10:
                add = 1
            else:
                add = 0
            node.val %= 10
            cur.next, cur = node, node 
        if add:
            cur.next = ListNode(1)
        return(l3.next)

代碼中cur = l3,表示cur和l3都指向了同一個(gè)鏈表眼五,在另一句cur.next, cur = node, node中,當(dāng)?shù)谝淮螆?zhí)行這句話時(shí)彤灶,首先cur.next指向了node看幼,也代表了l3.next也指向了node,然后cur再指向node幌陕,也就是指向了l3的next速那;當(dāng)再一次執(zhí)行時(shí)诗茎,首先cur.next指向node就相當(dāng)于l3.next.next指向node,以此類推济丘,從而cur就相當(dāng)于實(shí)現(xiàn)了C中的指針的作用了来惧。

Remove Duplicates from Sorted List


這個(gè)題目的意思是去除掉鏈表中所有重復(fù)的元素,即每個(gè)元素只保留一次心例,方法就是遍歷這個(gè)鏈表宵凌,每次將當(dāng)前節(jié)點(diǎn)的值跟下一個(gè)的節(jié)點(diǎn)的值相比,如果相同則將當(dāng)前節(jié)點(diǎn)指向下下個(gè)節(jié)點(diǎn)即可止后,需要注意的是如果下下個(gè)節(jié)點(diǎn)沒有的話摆寄,則當(dāng)前節(jié)點(diǎn)指向None。代碼如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # @param head, a ListNode
    # @return a ListNode
    def deleteDuplicates(self, head):
        if head == None:
            return(None)
        else:
            cur = ListNode(head.val)
            cur.next, head = head, cur
            while cur:
                if cur.next and cur.val == cur.next.val:
                    if cur.next.next:
                        cur.next = cur.next.next
                    else:
                        cur.next = None
                else:
                    cur = cur.next
            return(head)

Remove Duplicates from Sorted List II


這個(gè)題是上一個(gè)題目的升級(jí)版,只要出現(xiàn)重復(fù)的數(shù)字微饥,這些數(shù)字都要從鏈表中刪掉逗扒,方法是在鏈表前先加一個(gè)節(jié)點(diǎn)以及一個(gè)刪除標(biāo)識(shí),然后遍歷這個(gè)鏈表欠橘,比較后兩個(gè)節(jié)點(diǎn)是否相同矩肩,如果相同,先刪掉第一個(gè)節(jié)點(diǎn)肃续,并讓刪除標(biāo)識(shí)變?yōu)檎媸蜷荩砻飨乱淮尾僮餍枰训诙€(gè)節(jié)點(diǎn)刪掉(即使下一次比較的時(shí)候兩個(gè)節(jié)點(diǎn)值不同,但是上次只刪掉了一個(gè)重復(fù)節(jié)點(diǎn)始锚,所以還是要把它刪掉)刽酱,如果下兩個(gè)節(jié)點(diǎn)不同且刪除標(biāo)識(shí)不為真則跳過。代碼如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # @param head, a ListNode
    # @return a ListNode
    def deleteDuplicates(self, head):
        if head == None or head.next == None:
            return(head)
        cur = ListNode(head.val)
        cur.next, head = head, cur
        flag = False
        while cur:
            if cur.next and cur.next.next and cur.next.val == cur.next.next.val:
                cur.next = cur.next.next
                flag = True
            elif flag and cur.next:
                cur.next = cur.next.next
                flag = False
            else:
                cur = cur.next
        return(head.next)

Remove Duplicates from Sorted Array


這個(gè)題與上面兩個(gè)題類似瞧捌,只是有鏈表變?yōu)榱酥羔樋美铮枰⒁獾氖请m然題目只要求返回?cái)?shù)組的長(zhǎng)度,但是它還有一個(gè)隱性的要求就是要使得數(shù)組A[0:len]是你想要的得到的不包含重復(fù)元素的數(shù)組姐呐,如他給的例子A=[1殿怜,1,2],remove 完之后要求A=[1,2,2]曙砂,也就是說A[0:2] = [1头谜,2]。我就在這里卡了好久鸠澈。柱告。。代碼如下:

class Solution:
    # @param a list of integers
    # @return an integer
    def removeDuplicates(self, A):
        if A == []:
            return(0)
        count = 1
        for i in range(1,len(A)):
            if A[i] != A[i-1]:
                A[count] = A[i]
                count += 1
        return(count)

Remove Duplicates from Sorted Array II


這個(gè)題是上個(gè)題目的升級(jí)版笑陈,這是移除數(shù)組中重復(fù)元素大于2個(gè)的元素并返回新數(shù)組的長(zhǎng)度末荐,思想類似,這里就不在贅述新锈,直接貼代碼:

class Solution:
    # @param A a list of integers
    # @return an integer
    def removeDuplicates(self, A):
        if len(A) <= 2: 
            return(len(A))
        count = 2
        for i in range(2,len(A)):
            if A[i] != A[count-1] or A[i] != A[count-2]:
                A[count] = A[i]
                count += 1
        return(count)

Pascal's Triangle


精簡(jiǎn)版
題目的意思是生成n行的Pascal's三角并存入到列表中。思路是第i(i>=3)的第j個(gè)元素等于第i-1行的第j-1個(gè)元素和第j個(gè)元素之和眶熬,初識(shí)化第一二行之后for一下就可以了妹笆,另外由于Pascal's三角是對(duì)稱的,所以我們每次只需算前一半即可娜氏。代碼如下:

class Solution:
    # @return a list of lists of integers
    def generate(self, numRows):
        if numRows == 1:
            return([[1]])
        elif numRows == 2:
            return([[1],[1,1]])
        elif numRows == 0:
            return([])
        else:
            result = [[1],[1,1]]
            for i in range(3, numRows+1):
                tmp = [1]*i
                last = result[i-2]
                for j in range(1,(i-1)//2 + 1):
                    tmp[j] = tmp[i-1-j] = last[j-1] +last[j]
                result.append(tmp)
            return(result)

Pascal's Triangle II


這個(gè)題跟上一個(gè)題目類似拳缠,只是這次不是全部返回,而是只返回固定的某一行贸弥。由于Pascal's三角中的第i行第j個(gè)元素

_LeTeX(簡(jiǎn)書不支持): _ $$L(i,j)=C^{j-1}_i=\frac{i!}{(j-1)!(n-j+1)!}$$

Pascal's 三角

所有我們就可以很簡(jiǎn)單得到任意一行的值了窟坐,只需再添加一個(gè)計(jì)算階乘的函數(shù),代碼如下:

class Solution:
    # @return a list of integers
    def getRow(self, rowIndex):
        result = [1]*(rowIndex + 1)
        for i in range(1,(rowIndex)//2 + 1):
            result[i] = result[rowIndex-i] = self.factorial(rowIndex)//(self.factorial(i)*self.factorial(rowIndex-i))
        return(result)
    def factorial(self, n):
        if n == 1:
            return(1)
        else:
            return(n*self.factorial(n-1))

Minimum Depth of Binary Tree


這個(gè)題目是計(jì)算一顆二叉樹的最小深度,分別計(jì)算左右子樹的深度哲鸳,然后取較小臣疑,深度的計(jì)算方法是如果節(jié)點(diǎn)是葉子節(jié)點(diǎn)深度加1,如果節(jié)點(diǎn)有子節(jié)點(diǎn)深度加1徙菠,初識(shí)化左右子樹深度為無窮大讯沈。代碼如下:

# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # @param root, a tree node
    # @return an integer
    def minDepth(self, root):
        if root == None:
            return(0)
        if root.left == None and root.right == None:
            return(1)
        left = right = float("inf") # 表示無窮大
        if root.left != None:
            left = 1 + self.minDepth(root.left)
        if root.right != None:
            right = 1 + self.minDepth(root.right)
        return(min(left, right))

Maximum Depth of Binary Tree


與上題類似,只不過是找樹的最大深度婿奔,改一下判別條件就可以了缺狠。代碼如下:

# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # @param root, a tree node
    # @return an integer
    def maxDepth(self, root):
        if root == None:
            return(0)
        if root.left == None and root.right == None:
            return(1)
        left = right = -1
        if root.left != None:
            left = 1 + self.maxDepth(root.left)
        if root.right != None:
            right = 1 + self.maxDepth(root.right)
        return(max(left, right))

Path Sum


這個(gè)題的意思是一顆二叉樹上是否存在一條從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑,其上所有節(jié)點(diǎn)之和等于一個(gè)指定的數(shù)萍摊。方法就是當(dāng)我們從根節(jié)點(diǎn)往下遞歸時(shí)挤茄,看當(dāng)前節(jié)點(diǎn)是否存在sum減去前面節(jié)點(diǎn)之和的路徑存在。代碼如下:

# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # @param root, a tree node
    # @param sum, an integer
    # @return a boolean
    def hasPathSum(self, root, sum):
        result = False
        if root == None:
            return(result)
        else:
            sum -= root.val
            if sum == 0 and root.left == None and root.right == None:
                result = True
                return(result)
            else:
                if root.left:
                    result = result or self.hasPathSum(root.left, sum) # 只要存在一條就返回True
                if root.right:
                    result = result or self.hasPathSum(root.right, sum)
                return(result)

Length of Last Word


求一行字符串中最后一個(gè)單詞的長(zhǎng)度冰木,這個(gè)題用python做就非常簡(jiǎn)單了穷劈,代碼如下:

class Solution:
    # @param s, a string
    # @return an integer
    def lengthOfLastWord(self, s):
        if s == '':
            return(0)
        result = s.split()
        if result == []:
            return(0)
        return(len(result[-1]))

Add Binary


這個(gè)題目非常簡(jiǎn)單,就是二進(jìn)制的加法片酝。對(duì)于我們這種python的初學(xué)者來說難點(diǎn)是字符串與列表的轉(zhuǎn)化囚衔,題目本身需要注意的一個(gè)地方就是,最后可能由于進(jìn)位需要補(bǔ)一位雕沿,我們可以先把字符串先倒一轉(zhuǎn)再加练湿,這樣就可以在末尾補(bǔ)位。代碼如下:

class Solution:
    # @param a, a string
    # @param b, a string
    # @return a string
    def addBinary(self, a, b):
        a = a[::-1] # 字符串倒序
        b = b[::-1] # 字符串倒序
        i = j = 0
        c = []
        add = 0 # 表示進(jìn)位
        while i < len(a) or j < len(b):
            if i < len(a) and j < len(b):
                tmp = (int(a[i]) + int(b[j]) + add) % 2
                c.append(str(tmp))
                if (int(a[i]) + int(b[j]) + add) >= 2:
                    add = 1
                else:
                    add = 0
                i += 1
                j += 1
            if i < len(a) and j>= len(b):
                tmp = (int(a[i]) + add)%2
                c.append(str(tmp))
                if (int(a[i]) + add) >= 2:
                    add = 1
                else:
                    add = 0
                i += 1
            if i >= len(a) and j < len(b):
                tmp = (int(b[j]) + add)%2
                c.append(str(tmp))
                if (int(b[j]) + add) >= 2:
                    add = 1
                else:
                    add = 0
                j += 1
        if add:
            c.append('1')
        c = c[::-1]
        result = "".join(c)
        return(result)

Valid Parentheses


這道題是判斷括號(hào)是否匹配审轮,就是利用棧來進(jìn)行解決肥哎,遇到正括號(hào)加入棧,遇到反括號(hào)彈出椉苍看是否匹配篡诽,只不過剛開始時(shí)可以直接排除一些結(jié)果:

  1. 如果字符串的長(zhǎng)度為奇數(shù), 必然False.
  2. 如果最后一個(gè)字符是( [ {必然False.
  3. 第一個(gè)字符為) ] }必然False等.

代碼如下:

class Solution:
    # @return a boolean
    def isValid(self, s):
        if len(s)%2 != 0 or s[-1] == '(' or s[-1] =='[' or s[-1] =='{':
            return(False)
        result = True
        a = []
        for i in range(len(s)):
            if s[i] =='(' or s[i] =='[' or s[i] =='{':
                a.append(s[i])
            else:
                if len(a) == 0:
                    result = False
                    break
                if s[i] == ')':
                    if a.pop() != '(':
                        result = False
                        break
                if s[i] == ']':
                    if a.pop() != '[':
                        result = False
                        break
                if s[i] == '}':
                    if a.pop() != '{':
                        result = False
                        break
        return(result)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市榴捡,隨后出現(xiàn)的幾起案子杈女,更是在濱河造成了極大的恐慌,老刑警劉巖吊圾,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件达椰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡项乒,警方通過查閱死者的電腦和手機(jī)啰劲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檀何,“玉大人蝇裤,你說我怎么就攤上這事廷支。” “怎么了栓辜?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵恋拍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我啃憎,道長(zhǎng)芝囤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任辛萍,我火速辦了婚禮悯姊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贩毕。我一直安慰自己悯许,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布辉阶。 她就那樣靜靜地躺著先壕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谆甜。 梳的紋絲不亂的頭發(fā)上垃僚,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音规辱,去河邊找鬼谆棺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛罕袋,可吹牛的內(nèi)容都是我干的改淑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼浴讯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼朵夏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榆纽,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤仰猖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后奈籽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饥侵,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年唠摹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奉瘤。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勾拉,死狀恐怖煮甥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藕赞,我是刑警寧澤成肘,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站斧蜕,受9級(jí)特大地震影響双霍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜批销,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一洒闸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧均芽,春花似錦丘逸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劲妙,卻和暖如春湃鹊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镣奋。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工币呵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唆途。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓富雅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肛搬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子没佑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容