力扣代码学习日记七

Problem: 1822. 数组元素积的符号

思路

已知函数 signFunc(x) 将会根据 x 的正负返回特定值:

  • 如果 x 是正数,返回 1
  • 如果 x 是负数,返回 -1
  • 如果 x 是等于 0 ,返回 0

给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。

返回 signFunc(product)

解题方法

解法一:常用思路使用reduce函数计算乘积,并根据乘积的正负,使用if判断来返回相应的值

解法二:为了提高效率,实际上不需要计算完整的乘积,因为如果数组中包含零,那么乘积将会是零,返回值会是 0。如果数组中有奇数个负数,乘积将会是负数,返回值会是 -1。如果数组中有偶数个负数且没有零,那么乘积将会是正数,返回值会是 1。

复杂度

时间复杂度:

该方法通过一次遍历来判定整个数组的乘积符号,因此时间复杂度主要取决于数组 nums 的长度。设数组长度为 n,则该算法的时间复杂度为 O(n),因为它需要对数组中的每个元素进行一次操作。

空间复杂度:

该方法中,我们只使用了一个额外的变量 sign 来存储乘积的符号。这个变量的空间占用是常量级别的,不随输入数组 nums 的大小而改变。因此,空间复杂度为 O(1),也就是说它只需要一个固定的空间量,与输入的数组大小无关。

代码

解法一:

python 复制代码
from functools import reduce
class Solution(object):
    def arraySign(self, nums):
        if not nums:  # 检查列表是否为空
            return 0

        # 使用reduce函数计算乘积,并根据乘积的正负返回相应的值
        product = reduce(lambda x, y: x * y, nums)

        if product > 0:
            return 1
        elif product < 0:
            return -1
        else:
            return 0

解法二:

python 复制代码
class Solution(object):
    def arraySign(self, nums):
        # 初始化标记变量
        sign = 1
        
        # 遍历数组中的每个数
        for num in nums:
            # 如果数组中有0,乘积为0,直接返回0
            if num == 0:
                return 0
            # 如果数组中有负数,翻转符号标记
            elif num < 0:
                sign = -sign
        
        # 如果负数个数为偶数,sign保持为1,否则为-1
        return sign
相关推荐
JieE21221 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言