【Task06】LeetCode腾讯精选打卡

一、No0043. 合并K个升序链表

题目

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例1

  • 输入: num1 = “2”, num2 = “3”
  • 输出: “6”

示例2

  • 输入: num1 = “123”, num2 = “456”
  • 输出: “56088”

说明

  • num1 和 num2 的长度小于110。
  • num1 和 num2 只包含数字 0-9。
  • num1 和 num2 均不以零开头,除非是数字 0 本身。
  • 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

解题代码(Python3)

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        res = 0
        locx = 1
        for x in num1[::-1]:
            locy = 1
            for y in num2[::-1]:
                res += int(x) * int(y) * locx * locy
                locy *= 10
            locx *= 10
        return str(res)

思路:

分别用locx和locy表示当前所在位(1代表个位数,2代表十位数以此类推),固定第一个字符的位数,将其与第二个字符中所有位置进行乘法(需要提前转换成int),然后将其存入res;之后遍历第一个字符的其他位置即可。

注意返回的res要通过str()方法转换成字符类型。

复杂度分析:

  • 时间复杂度O(n^2) 双重循环
  • 空间复杂度O(1)

运行结果:

【Task06】LeetCode腾讯精选打卡_第1张图片

二、No0046. 全排列

题目

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例

  • 输入: [1,2,3]
  • 输出:
    [
    [1,2,3],
    [1,3,2],
    [2,1,3],
    [2,3,1],
    [3,1,2],
    [3,2,1]
    ]

解题代码(Python3)

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        ori = [x for x in nums]
        res = [[x] for x in nums]
        for i in range(len(nums) - 1):
            res = [x + [y] for x in res for y in ori if y not in x]
        return res

思路:

外层循环次数是数字序列的长度 - 1,建立ori和res两个辅助List进行循环赋值。

复杂度分析:

  • 时间复杂度 O(n^3) 2层的列表推导生成式+1层外循环
  • 空间复杂度 O(n) 3个n长度的List

运行结果:

【Task06】LeetCode腾讯精选打卡_第2张图片

三、No0053. 最大子序和

题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例

  • 输入: [-2,1,-3,4,-1,2,1,-5,4]
  • 输出: 6
  • 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

解题代码(Python3)

尝试1

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        length = len(nums)
        matrix = [[float("-inf")]*length for x in range(length)]
        #对角线赋值
        for i,x in enumerate(nums):
            matrix[i][i] = x
        for col in range(1,length):
            for index in range(col-1,-1,-1):
                matrix[index][col] = matrix[index+1][col] + matrix[index][index]
        print(matrix)
        return max([max(x) for x in matrix])

思路:

利用二维矩阵存储连续元素和,然后通过max函数返回整体最大值

复杂度分析:

  • 时间复杂度O(n^2)
  • 空间复杂度O(n^2)

运行结果:

【Task06】LeetCode腾讯精选打卡_第3张图片

尝试2

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        length = len(nums)
        for i in range(1,length):
            nums[i] = nums[i-1] + nums[i] if nums[i-1] > 0 else nums[i]
        return max(nums)

思路:

从第二个元素开始,若前一个元素的值大于0,则进行叠加,利用了传递性。

复杂度分析:

  • 时间复杂度O(n)
  • 空间复杂度O(1)

运行结果:

【Task06】LeetCode腾讯精选打卡_第4张图片

尝试3

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        length = len(nums)
        maxV = last = nums[0]
        for i in range(1,length):
            cur = max(nums[i] + last,nums[i])
            maxV = cur if cur > maxV else maxV
            last = cur
        return maxV

思路:

  • 用maxV和last记录最大值和之前的和
  • 循环到一个元素时,先判断last是否为负,若为负则舍去之前的元素,只保留当前元素,注意此时改元素也可能为负
  • 比较maxV和当前和的大小,并进行更新
  • 将last设置为当前和,用于下轮驯循环

复杂度分析:

  • 时间复杂度O(n)
  • 空间复杂度O(1)

运行结果:

【Task06】LeetCode腾讯精选打卡_第5张图片

你可能感兴趣的:(#,LeetCode,腾讯精选练习,50,题,python,算法,数据结构,leetcode,datawhale)