力扣代码学习日记七

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
相关推荐
努力长头发的程序猿29 分钟前
Unity2D当中的A*寻路算法
算法·unity·c#
23471021271 小时前
4.18 学习笔记
软件测试·笔记·python·学习
Raink老师2 小时前
用100道题拿下你的算法面试(矩阵篇-2):求转置矩阵
算法·面试·矩阵
算法鑫探8 小时前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
lizhihai_998 小时前
股市学习心得-AI算力20大硬件四金刚
学习
卖芒果的潇洒农民8 小时前
【0417】学习路线
学习
WBluuue8 小时前
数据结构与算法:康托展开、约瑟夫环、完美洗牌
c++·算法
木子墨5168 小时前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
han_hanker9 小时前
RequestAttributes , ServletRequestAttributes学习
学习
王老师青少年编程9 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌