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