力扣代码学习日记七

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
相关推荐
jllllyuz1 分钟前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
夏鹏今天学习了吗11 分钟前
【LeetCode热题100(72/100)】前 K 个高频元素
leetcode
稚辉君.MCA_P8_Java13 分钟前
DeepSeek 插入排序
linux·后端·算法·架构·排序算法
多多*16 分钟前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
.YM.Z1 小时前
【数据结构】:排序(一)
数据结构·算法·排序算法
Chat_zhanggong3451 小时前
K4A8G165WC-BITD产品推荐
人工智能·嵌入式硬件·算法
百***48072 小时前
【Golang】slice切片
开发语言·算法·golang
墨染点香2 小时前
LeetCode 刷题【172. 阶乘后的零】
算法·leetcode·职场和发展
做怪小疯子2 小时前
LeetCode 热题 100——链表——反转链表
算法·leetcode·链表
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [block]bio
linux·笔记·学习