LeetCode个人笔记python篇(medium)

2. 两数相加

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

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        l3 = ListNode(0)
        p3 = l3
        tmpsum = 0
        while True:
            if l1:
                tmpsum += l1.val
                l1 = l1.next
            if l2:
                tmpsum += l2.val
                l2 = l2.next
            p3.val = tmpsum%10
            tmpsum = tmpsum//10
            if l1 == None and l2 == None and tmpsum == 0:
                break
            p3.next = ListNode(0)
            p3 = p3.next
        return l3

主要思想和计算加法的思想一样,先看l1是否有数字,有就加,再看l2,直到l1,l2和进位都为空的时候就停止循环。往新链表里插入节点时,要先初始化一个ListNode,再插入。

74. 搜索二维矩阵

这种有序矩阵,首先想到的是从右上角判断,先判断是否大于最后一个数,如果不大于就搜索本行,再没有就返回false。需要注意列表中没有数的情况。如[[]],[[1]]这种情况。

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        l1 = len(matrix)
        if l1 == 0:
            return False
        l2 = len(matrix[0])
        if l2 == 0:
            return False
        for i in range(l1):
            if target > matrix[i][l2-1]:
                continue
            else:
                for j in range(l2):
                    if target == matrix[i][j]:
                        return True
                    elif target > matrix[i][j]:
                        continue
                    else:
                        return False
                return False
        return False

还有一份代码是这样写的:

        lst = []
        for i in range(len(matrix)):
            lst += matrix[i]
        return target in set(lst)

list直接用+,比如a = [1,2,3],b = [4,5,6],c = a+b,c的结果:[1,2,3,4,5,6]

用extend,a = [1,2,3],b = [4,5,6],a.extend(b),a的结果:[1,2,3,4,5,6]。不同的是+是生成一个新的,extend是在原数组a上进行改动

144. 二叉树的前序遍历

class Solution:
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return []
        result=[root.val]
        return result+self.preorderTraversal(root.left)+self.preorderTraversal(root.right)

如果不用列表相加,可以重写一个函数进行递归调用,把列表拿出来

153. 寻找旋转排序数组中的最小值

这道题是二分查找的变形。令first=0,last=len(nums)-1,因为是升序数组,当中间的值大于first的时候,代表它在前面的升序数组中;如果小于first代表是后面的部分。last所指即为最小。

class Solution(object):
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        first = 0
        last = len(nums) - 1
        flag = 0
        while nums[first] > nums[last]:
            flag = 1
            if last - first == 1:
                mid = last
                break
            mid = (first + last)//2
            if nums[mid] > nums[first]:
                first = mid
            else:
                last = mid
        if flag == 0:
            return nums[0]
        else:
            return nums[last]

其中flag是保证数组无需旋转的情况正确。

442. 数组中重复的数据

首先想到的是排序,然后遍历一遍。

class Solution:
    def findDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        two_list = []
        nums2 = sorted(nums)
        for i in range(1,len(nums2)):
            if nums2[i-1] ==nums2[i]:
                two_list.append(nums2[i-1])
        return two_list

但是很显然,这样的方法效率不高,不如用字典,类似哈希表。还有一种更快的方法是用集合:

class Solution:
    def findDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        a = []
        b = set()
        for num in nums:
            if num in b:
                a.append(num)
            else:
                b.add(num)
        return a

450. 删除二叉搜索树中的节点

1、结点有左子树无右子树,结点等于左子树

2、结点有右子树无左子树,结点等于右子树

3、左右子树均存在,用右子树最左结点或者左子树最右结点替代

#非递归
class Solution(object):
    def deleteNode(self, root, key):
        """
        :type root: TreeNode
        :type key: int
        :rtype: TreeNode
        """ 
        # 找到该节点 并保存其父亲节点
        pre, q = None, root
        while q and q.val != key:
            pre = q
            if q.val < key:
                q = q.right
            else:
                q = q.left
        if not q: # 如果没有该key
            return root
        
        if not q.left: # 如果没有左子树 (或 左右子树都没有)
            if not pre: # 说明要删的是根节点
                return q.right
            if pre.left == q:#连在父节点的左子树上
                pre.left = q.right
            else:
                pre.right = q.right
        else: # 如果有左子树 提左子树的最右叶子 或 提右子树的最左叶子
            # 找到左子树的最右叶子
            tmp = q.left
            while tmp.right:
                tmp = tmp.right
            tmp.right = q.right
            if not pre: # 说明要删的是根节点
                return q.left
            if pre.left == q:
                pre.left = q.left
            else:
                pre.right = q.left
        return root


#递归
class Solution(object):
    def deleteNode(self, root, key):
        """
        :type root: TreeNode
        :type key: int
        :rtype: TreeNode
        """
        if not root:
            return None
        #到左子树里搜索
        if root.val > key:
            root.left = self.deleteNode(root.left, key)
        #到右子树里搜索
        elif root.val < key:
            root.right = self.deleteNode(root.right, key)
        else:
        	# 存在的子树代替根节点
            if not root.left or not root.right:
                root = root.left if root.left else root.right
            else:
                temp = root.right
                # 找到右子树的最小(最左)节点
                while temp.left: 
                    temp = temp.left
                root.val = temp.val
                # 继续在右子树里递归
                root.right = self.deleteNode(root.right, temp.val)
            
        return root

701. 二叉搜索树中的插入操作

class Solution(object):
    def insertIntoBST(self, root, val):
        """
        :type root: TreeNode
        :type val: int
        :rtype: TreeNode
        """
        if not root:
            root = TreeNode(val)
            return root
        search = root
        while search:
            insertParent = search
            if val < search.val:
                search = search.left
            else:
                search = search.right
        insertNode = TreeNode(val)
        if insertParent.val > val:
            insertParent.left = insertNode
        else:
            insertParent.right = insertNode
        return root

不考虑平衡性,二叉搜索树插入就是简单的小于往右大于往左,设置一个父节点,然后到空时插入父节点下面。

你可能感兴趣的:(leetcode,medium)