Leetcode題解 - Easy - 3

67- 二進(jìn)制求和

問(wèn)題

給定兩個(gè)二進(jìn)制字符串纲岭,返回他們的和(用二進(jìn)制表示)。

輸入為非空字符串且只包含數(shù)字 1 和 0窃蹋。

示例 1:
輸入: a = "11", b = "1"
輸出: "100"

示例 2:
輸入: a = "1010", b = "1011"
輸出: "10101"

思路

從右向左准潭,注意不等長(zhǎng)情況,注意進(jìn)位情況腔丧。另外要留心下標(biāo)放椰,不要搞混了。

答案

class Solution:
    def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
        add = 0
        result = ''
        while a and b : # 公共部分
            tmp = int(a[-1]) + int(b[-1]) + add
            if tmp >= 2:
                add = 1
                tmp = tmp % 2
            else:
                add = 0
            result = str(tmp) + result
            a = a[:-1]
            b = b[:-1]
        remain = ''
        ret = a if a else b
        while ret:
            tmp = int(ret[-1]) + add
            if tmp >= 2:
                add = 1
                tmp = tmp % 2
            else:
                add = 0
            result = str(tmp) + result
            ret = ret[:-1]
        if add:
            result = str(add) + result
        return result

69- x的平方根

問(wèn)題

實(shí)現(xiàn) int sqrt(int x) 函數(shù)愉粤。

計(jì)算并返回 x 的平方根砾医,其中 x 是非負(fù)整數(shù)。

由于返回類型是整數(shù)衣厘,結(jié)果只保留整數(shù)的部分如蚜,小數(shù)部分將被舍去。

示例
輸入: 8
輸出: 2
說(shuō)明: 8 的平方根是 2.82842..., 由于返回類型是整數(shù)影暴,小數(shù)部分將被舍去错邦。

思路

主要兩種方法:牛頓迭代法,二分查找法型宙。

具體可參見這里

代碼

class Solution:
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x == 0 or x == 1:
            return x
        x0 = x
        t = x
        x0 = x0 / 2 + t / (2 * x0)
        while abs(x0 * x0 - t) > 0.00001:
            x0 = x0 / 2 + t / (2 * x0)
        return int(x0)

70 - 爬樓梯

問(wèn)題

假設(shè)你正在爬樓梯兴猩。需要 n 階你才能到達(dá)樓頂。

每次你可以爬 1 或 2 個(gè)臺(tái)階早歇。你有多少種不同的方法可以爬到樓頂呢倾芝?

注意:給定 n 是一個(gè)正整數(shù)。

思路

斐波那契數(shù)列箭跳,與之前劍指offer中的題目重合晨另,參見這里

代碼

記得要從小往大來(lái)計(jì)算谱姓,而不要從大往小來(lái)遞歸借尿,不然會(huì)有很多重復(fù)計(jì)算,超時(shí)

class Solution:
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <= 2:
            return n 
        f1 = 1
        f2 = 2
        for i in range(3, n+1):
            f1, f2 = f2, f1 + f2
        return f2

83- 刪除排序鏈表中的重復(fù)元素

問(wèn)題

給定一個(gè)排序鏈表屉来,刪除所有重復(fù)的元素路翻,使得每個(gè)元素只出現(xiàn)一次。

思路

## 代碼
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head or not head.next:
            return head
        pre = head
        cur = head.next
        while cur:
            if cur.val != pre.val:
                pre.next = cur
                pre = cur
            cur = cur.next
        pre.next = cur
        return head

88- 合并兩個(gè)有序數(shù)組

問(wèn)題

給定兩個(gè)有序整數(shù)數(shù)組 nums1 和 nums2茄靠,將 nums2 合并到 nums1 中茂契,使得 num1 成為一個(gè)有序數(shù)組。

說(shuō)明:

  • 初始化 nums1 和 nums2 的元素?cái)?shù)量分別為 m 和 n慨绳。
  • 你可以假設(shè) nums1 有足夠的空間(空間大小大于或等于 m + n)來(lái)保存 nums2 中的元素掉冶。

思路

要注意題目的要求:在nums1本地改動(dòng)真竖,不返回新的數(shù)組。再加上已經(jīng)給出了兩個(gè)list的元素個(gè)數(shù)厌小,又是有序數(shù)組恢共,做有序數(shù)組的歸并,注意需要從后往前做璧亚,這樣可以無(wú)需挪動(dòng)讨韭,極大提高效率。

代碼

class Solution:
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: void Do not return anything, modify nums1 in-place instead.
        """
        p = m + n - 1
        m = m - 1
        n = n - 1
        while m >= 0 and n >= 0:
            if nums1[m] >= nums2[n]:
                nums1[p] = nums1[m]
                m -= 1
            else:
                nums1[p] = nums2[n]
                n -= 1
            p -= 1
        while n >= 0:
            nums1[p] = nums2[n]
            n -= 1
            p -= 1

100- 相同的樹

問(wèn)題

給定兩個(gè)二叉樹癣蟋,編寫一個(gè)函數(shù)來(lái)檢驗(yàn)它們是否相同拐袜。

如果兩個(gè)樹在結(jié)構(gòu)上相同,并且節(jié)點(diǎn)具有相同的值梢薪,則認(rèn)為它們是相同的蹬铺。

思路

遞歸遍歷吧

代碼

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        if p == None and q == None:
            return True
        elif not p or not q :
            return False
        if p.val != q.val:
            return False
        if self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right):
            return True
        return False

101- 對(duì)稱二叉樹

問(wèn)題

給定一個(gè)二叉樹,檢查它是否是鏡像對(duì)稱的秉撇。

思路

1)遞歸
如果一棵樹的左右兩個(gè)子樹對(duì)稱甜攀,這棵樹就是對(duì)稱的。據(jù)此可以寫一個(gè)遞歸函數(shù)琐馆,判斷兩棵樹是否對(duì)稱(當(dāng)根節(jié)點(diǎn)值相同规阀,且每棵樹的右子樹都與另一棵樹的左子樹對(duì)稱,這兩棵樹對(duì)稱)瘦麸。

2)迭代 【這個(gè)思路也是不錯(cuò)的谁撼,值得學(xué)習(xí)】
除了遞歸的方法外,我們也可以利用隊(duì)列進(jìn)行迭代滋饲。隊(duì)列中每?jī)蓚€(gè)連續(xù)的結(jié)點(diǎn)應(yīng)該是相等的厉碟,而且它們的子樹互為鏡像。最初屠缭,隊(duì)列中包含的是 root 以及 root箍鼓。該算法的工作原理類似于 BFS,但存在一些關(guān)鍵差異呵曹。每次提取兩個(gè)結(jié)點(diǎn)并比較它們的值款咖。然后,將兩個(gè)結(jié)點(diǎn)的左右子結(jié)點(diǎn)按相反的順序插入隊(duì)列中奄喂。當(dāng)隊(duì)列為空時(shí)铐殃,或者我們檢測(cè)到樹不對(duì)稱(即從隊(duì)列中取出兩個(gè)不相等的連續(xù)結(jié)點(diǎn))時(shí),該算法結(jié)束跨新。

代碼

  1. 遞歸
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if not root:
            return True
        return self.compare_two(root.left, root.right)
    
    def compare_two(self, lr, rr):
        if lr == None and rr == None:
            return True
        if lr == None or rr == None:
            return False
        return lr.val == rr.val and self.compare_two(lr.right, rr.left) and self.compare_two(lr.left, rr.right)

2) 迭代

class Solution:
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        q = [root, root]
        while q:
            left, right = q.pop(0), q.pop(0)
            if not left and not right:
                continue
            if left == None or right == None:
                return False
            if left.val != right.val:
                return False
            q.append(left.left)
            q.append(right.right)
            q.append(left.right)
            q.append(right.left)
        return True

104- 二叉樹的最大深度

問(wèn)題

給定一個(gè)二叉樹贴谎,找出其最大深度誉察。

思路

1)遍歷
2)迭代焚挠。注意在節(jié)點(diǎn)入棧時(shí),需要將其所處depth也一起放入词疼,這樣彈出時(shí)才可比較是否是最大深度俯树。

代碼

  1. 遍歷
class Solution:
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        else:
            left_height = self.maxDepth(root.left)
            right_height = self.maxDepth(root.right)
            return max(left_height, right_height) + 1

2)迭代

class Solution:
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        stack = []
        if root:
            stack.append((1, root))
        depth = 0
        while stack:
            current_depth, root = stack.pop()
            if root:
                depth = max(depth, current_depth)
                stack.append((current_depth + 1, root.left))
                stack.append((current_depth + 1, root.right))
        return depth

102- 二叉樹的層次遍歷 I (中等難度)

問(wèn)題

給定一個(gè)二叉樹帘腹,返回其按層次遍歷的節(jié)點(diǎn)值。 (即逐層地许饿,從左到右訪問(wèn)所有節(jié)點(diǎn))阳欲。
例如:
給定二叉樹:

    3
   / \
  9  20
    /  \
   15   7

返回其層次遍歷結(jié)果:

[
  [3],
  [9,20],
  [15,7]
]

思路

與之前遇到的層次遍歷不同的地方在于,這個(gè)題的返回結(jié)果要分層陋率。

而一種非常巧妙的做法是球化,在每一層開始的時(shí)候,q的長(zhǎng)度就是該層的節(jié)點(diǎn)數(shù)量瓦糟,(初始q中只有root筒愚,長(zhǎng)度為1,代表第1層只有root一個(gè)節(jié)點(diǎn))所以無(wú)需記錄每個(gè)節(jié)點(diǎn)位于第幾層菩浙,像下面代碼寫的這樣就可以實(shí)現(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:
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []
        q = [root, ]
        result = []
        while q:
            level = []
            size = len(q)
            while size > 0:
                node = q.pop(0)
                level.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
                size -= 1
            result.append(level)
        return result

107- 二叉樹的層次遍歷 II

跟102一樣陆淀,只是要求結(jié)果反轉(zhuǎn)一下,從底層向上層逐層遍歷先嬉。按照102寫法最后把列表反轉(zhuǎn)一下就行轧苫。

108- 將有序數(shù)組轉(zhuǎn)換為二叉搜索樹

問(wèn)題

將一個(gè)按照升序排列的有序數(shù)組,轉(zhuǎn)換為一棵高度平衡二叉搜索樹疫蔓。

本題中含懊,一個(gè)高度平衡二叉樹是指一個(gè)二叉樹每個(gè)節(jié)點(diǎn) 的左右兩個(gè)子樹的高度差的絕對(duì)值不超過(guò) 1。

示例:

給定有序數(shù)組: [-10,-3,0,5,9],
一個(gè)可能的答案是:[0,-3,9,-10,null,5]衅胀,它可以表示下面這個(gè)高度平衡二叉搜索樹:

      0
     / \
   -3   9
   /   /
 -10  5

思路

二叉搜索樹的左子樹節(jié)點(diǎn)值小于根绢要,右子樹節(jié)點(diǎn)值大于根,給定的又是一個(gè)排序數(shù)組拗小,觀察一下發(fā)現(xiàn)可以將數(shù)組從中間一分為二重罪,分別作為左右子樹,再繼續(xù)二分下去哀九,如此遞歸來(lái)做剿配。

代碼


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def sortedArrayToBST(self, nums):
        """
        :type nums: List[int]
        :rtype: TreeNode
        """
        if not nums:
            return None
        return self.build_tree(nums, 0, len(nums) - 1)
    
    def build_tree(self, nums, l, r):
        if l > r:
            return None
        if l == r:
            return TreeNode(nums[l])
        mid = (l + r) // 2
        root = TreeNode(nums[mid])
        root.left = self.build_tree(nums, l, mid - 1)
        root.right = self.build_tree(nums, mid + 1, r)
        return root
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阅束,隨后出現(xiàn)的幾起案子呼胚,更是在濱河造成了極大的恐慌,老刑警劉巖息裸,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝇更,死亡現(xiàn)場(chǎng)離奇詭異沪编,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)年扩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蚁廓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人厨幻,你說(shuō)我怎么就攤上這事相嵌。” “怎么了况脆?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵饭宾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我格了,道長(zhǎng)看铆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任盛末,我火速辦了婚禮弹惦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘满败。我一直安慰自己肤频,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布算墨。 她就那樣靜靜地躺著宵荒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪净嘀。 梳的紋絲不亂的頭發(fā)上报咳,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音挖藏,去河邊找鬼暑刃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛膜眠,可吹牛的內(nèi)容都是我干的岩臣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宵膨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼架谎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辟躏,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谷扣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捎琐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體会涎,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裹匙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了末秃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片概页。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛔溃,靈堂內(nèi)的尸體忽然破棺而出绰沥,到底是詐尸還是另有隱情篱蝇,我是刑警寧澤贺待,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站零截,受9級(jí)特大地震影響麸塞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涧衙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一哪工、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弧哎,春花似錦雁比、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至序攘,卻和暖如春茴她,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背程奠。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工丈牢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞄沙。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓己沛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親距境。 傳聞我的和親對(duì)象是個(gè)殘疾皇子申尼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 本文內(nèi)容為練習(xí)LeetCode題目時(shí)的解題思路和不同算法的記錄,實(shí)現(xiàn)語(yǔ)言為C++肮疗,代碼保存在Github晶姊,均已在L...
    SK木眠閱讀 1,004評(píng)論 0 0
  • leetcode刷題記錄本文記錄一下leetcode刷題記錄,記錄一下自己的解法和心得伪货。 LeetCode Two...
    EarthChen閱讀 3,466評(píng)論 0 6
  • 做題们衙,實(shí)際寫出例子钾怔,然后分析可能遇到的情況,慢慢的蒙挑,思路就會(huì)出來(lái)了宗侦。 線性表 33. Search in Rota...
    小碧小琳閱讀 1,595評(píng)論 0 2
  • 前言 2. 實(shí)現(xiàn) Singleton 3. 數(shù)組中重復(fù)的數(shù)字 4. 二維數(shù)組中的查找 5. 替換空格 6. 從尾到...
    Observer_____閱讀 2,932評(píng)論 0 1
  • 這是吳曉波與周鴻祎的最近一次談話中矾利,老周提到的一句話。 作為互聯(lián)網(wǎng)的戰(zhàn)神馋袜,二年前他帶著自己的start up掀起的...
    花姐的麻麻是花爺閱讀 301評(píng)論 0 0