0210leetcode刷题5道python

88

题目描述;
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例:
在这里插入图片描述
解答:

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """

        '''
        nums1[m:]=nums2[:]
        nums1.sort()
        '''
        i,j,k=m-1,n-1,m+n-1
        while i>=0 and j>=0:
            if nums1[i]<nums2[j]:
                nums1[k]=nums2[j]
                k-=1
                j-=1
            else:
                nums1[k]=nums1[i]
                k-=1
                i-=1
        if j>=0:
            while j>=0:
                nums1[k]=nums2[j]
                k-=1
                j-=1

1423

题目描述:
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。

示例:
在这里插入图片描述
解答:

class Solution:
    def maxScore(self, cardPoints: List[int], k: int) -> int:
        #既然左右两边都可以取,那就直接看左边取n个,右边取k-n个
        res = 0
        total = [0]
        flag = 0
        for i in cardPoints: # 先记录累加和
            flag += i
            total.append(flag)
        for i in range(0,k+1): # i是左边分配的位置
            flag = total[i]+total[-1]-total[-1-k+i]
            res = max(flag,res)
        return res

剑指offer34

题目描述:
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

示例:
在这里插入图片描述
解答:

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

class Solution:
    def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
        res, path = [], []
        def recur(root, tar):
            if not root: return
            path.append(root.val)
            tar -= root.val
            if tar == 0 and not root.left and not root.right:
                res.append(list(path))
            recur(root.left, tar)
            recur(root.right, tar)
            path.pop()

        recur(root, sum)
        return res

剑指offer56-I

题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是 O(n),空间复杂度是O(1)。

示例:
在这里插入图片描述
解答:

class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        ret, index = 0, 0
        for n in nums:
            ret ^= n
        # 找从右向左数第几位不同,也就是第index位
        while ret & 1 == 0:
            index += 1
            ret >>= 1
        r1, r2 = 0, 0
        for n in nums:
            if (n >> index) & 1 == 0:
                r1 ^= n
            else:
                r2 ^= n
        return [r1, r2]

剑指offer68-II

题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
在这里插入图片描述
示例:
在这里插入图片描述
解答:

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

class Solution:
    def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
        # 求出到两个节点的路径,然后遍历数组,不相等的前一个为解
        if root == None:
            return None
        if root==p or root == q:
            return root
        left = self.lowestCommonAncestor(root.left,p,q)  # 左右子树寻找p,q
        right = self.lowestCommonAncestor(root.right,p,q)

        if left and right:        # 都找到了,一边一个
            return root
        if not left:              # 左子树没有,即都在右子树   
            return right
        if not right:
            return left

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/113685183