2024.5.2力扣刷题记录-数组篇记录6

一、628. 三个数的最大乘积

1.排序

class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        # 排序
        nums.sort(reverse = True)
        a, b, c, m, n = nums[0], nums[1], nums[2], nums[-1], nums[-2]
        # if a <= 0:
        #     # 全为负,返回答案只能为负
        #     return a * b * c
        # else:
        #     # 不全为负,返回答案为正
        #     return a * max(b * c, m * n)
        return max(a * b * c, a * m * n)

2.模拟

维护最大三位和最小两位

class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        # 模拟,维护最大三位和最小两位
        a, b, c, m, n = -inf, -inf, -inf, inf, inf
        for x in nums:
            if x > a:
                a, b, c = x, a, b
            elif x > b:
                b, c = x, b
            elif x > c:
                c = x
            if x < m:
                m, n = x, m
            elif x < n:
                n = x
        # if a <= 0:
        #     # 全为负,返回答案只能为负
        #     return a * b * c
        # else:
        #     # 不全为负,返回答案为正
        #     return a * max(b * c, m * n)
        return max(a * b * c, a * m * n)

 二、118. 杨辉三角

1.模拟

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        # 模拟
        if numRows == 1 or numRows == 2:
            return [[1] * (i + 1) for i in range(numRows)]
        ans = [[1] * (i + 1) for i in range(2)]     # 前两行
        # 从第三行开始
        for _ in range(2, numRows):
            row = []
            for i in range(1, len(ans[-1])):
                # 先计算得中间值
                row.append(ans[-1][i] + ans[-1][i - 1])
            # 再在两头添上1
            ans.append([1] + row + [1])
        return ans

2.错位相加

来自题解(. - 力扣(LeetCode)),学习一下。

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        # 错位相加
        ans = [[1]]
        while len(ans) < numRows:
            # 用加0和zip函数实现错位
            row = [a + b for a, b in zip([0] + ans[-1], ans[-1] + [0])]
            ans.append(row)
        return ans

 三、119. 杨辉三角 II

1.模拟

class Solution:
    def getRow(self, rowIndex: int) -> List[int]:
        # 模拟
        # 时复O(rowIndex^2),空复O(rowIndex)(算上返回数组row)
        row = [1]
        while len(row) < rowIndex + 1:
            # 行数从0开始编号
            row = [0] + row
            for i in range(len(row) - 1):
                row[i] += row[i + 1]
            # 最后一格没变,为1
        return row

2.数学,线性递推

思路来自官方题解方法2(. - 力扣(LeetCode))。

class Solution:
    def getRow(self, rowIndex: int) -> List[int]:
        # 数学,线性递推
        row = [1] * (rowIndex + 1)
        for i in range(1, rowIndex):
            # 最后一位也为1,可以不用更改
            row[i] = row[i - 1] * (rowIndex - i + 1) // i
        return row

感谢你看到这里!一起加油吧!

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值