力扣代码学习日记七

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
相关推荐
-Springer-2 分钟前
STM32 学习 —— 个人学习笔记2-2(新建工程)
笔记·stm32·学习
ctyshr12 分钟前
C++编译期数学计算
开发语言·c++·算法
tb_first13 分钟前
万字超详细苍穹外卖学习笔记4
java·spring boot·笔记·学习·spring·mybatis
zh_xuan20 分钟前
最小跳跃次数
数据结构·算法
yumgpkpm31 分钟前
2026软件:白嫖,开源,外包,招标,晚进场(2025年下半年),数科,AI...中国的企业软件产业出路
大数据·人工智能·hadoop·算法·kafka·开源·cloudera
孞㐑¥39 分钟前
算法—队列+宽搜(bfs)+堆
开发语言·c++·经验分享·笔记·算法
yufuu981 小时前
并行算法在STL中的应用
开发语言·c++·算法
zh_xuan1 小时前
单青蛙跳台阶
数据结构·算法
Kx_Triumphs1 小时前
计算几何-旋转卡壳两种实现方案(兼P1452题解
算法·题解
代码游侠1 小时前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法