首页 > 其他分享 >238. 除自身以外数组的乘积(中)

238. 除自身以外数组的乘积(中)

时间:2024-03-19 11:01:37浏览次数:27  
标签:乘积 nums 元素 238 result 数组 answer

目录

题目

  • 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
    题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
    请不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

题解:两遍前缀和

假如nums为[1,2,3,4],那么answer的值分别为[(2,3,4),(1,3,4),(1,2,4),(1,2,3)]
如果吧i当前值相乘的时候看做是1那么就有如下样式
1, 2, 3, 4
1, 1, 3, 4
1, 2, 1, 4
1, 2, 3, 1
他的对角线1将他们分割成了两个三角形,对于answer的元素,
我们可以先计算一个三角形每行的乘积,然后再去计算另外一个三角形每行的乘积,
然后两个三角形结果相乘,就是answer每个对应的元素

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        n = len(nums)
        l = [0] * n  # 用于存储左侧所有元素的乘积
        r = [0] * n  # 用于存储右侧所有元素的乘积
        # 初始化
        l[0] = 1
        r[n - 1] = 1
        # 计算 l 数组(左侧所有元素的乘积)
        for i in range(1, n):
            l[i] = l[i - 1] * nums[i - 1]#前面的乘积乘当前元素为当前及之前元素的乘积
        # 计算 r 数组(右侧所有元素的乘积)
        for i in range(n - 2, -1, -1):
            r[i] = r[i + 1] * nums[i + 1]#当前乘积和=当前值乘前面乘积和
        # 构造最终结果
        result = [0] * n
        for i in range(n):
            result[i] = l[i] * r[i]#左下角乘右上角为最终结果
        return result

标签:乘积,nums,元素,238,result,数组,answer
From: https://www.cnblogs.com/lushuang55/p/18082291

相关文章

  • 303. 区域和检索 - 数组不可变
    目录题目前缀和题目给定一个整数数组nums,处理以下类型的多个查询:计算索引left和right(包含left和right)之间的nums元素的和,其中left<=right实现NumArray类:NumArray(int[]nums)使用数组nums初始化对象intsumRange(inti,intj)返回数组nums中索引......
  • 重载自增++运算符预算符完成数组扩容
    今天突发奇想,我们平时的++运算符基本都只能自增数字,那我能不能实现一个当用户自增数组时也能完成数组增加一项呢(假设你不会使用c++的变长数组或者vector!)下面就是我的实现方法,各位大佬多多指教哦!比如说gyf大佬和yzs大佬以及lxb大佬?//重载++运算符扩容数组#include<......
  • 一维数组_ 石头剪刀布(老是感觉有错误的地方,请指正)
    任务描述石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问......
  • 209. 长度最小的子数组
    209.长度最小的子数组https://leetcode.cn/problems/minimum-size-subarray-sum/?envType=study-plan-v2&envId=top-interview-150 思路三种方法中,具有最优时间复杂度的方案滑动窗口设置start=0end=0执行循环:end向后探测,直到sum值大于等于target,更新最优长度......
  • JavaScript学习笔记5: 对象 - 数组Array
    JS对象-数组Array数组的定义及特性数组定义<script>//数组定义方式1,赋值给变量vararr1=newArray(1,2,3);//数组定义方式2,初始化数组vararr2=[4,5,6];</script>JS数组长度可变<script>vararr2=[4,5,6];//数组初始长度为3......
  • LeetCode2024年3月18日每日一题(303. 区域和检索 - 数组不可变)
    303.区域和检索-数组不可变一维前缀和定义构建前缀和数组区间求和示例适用场景题目代码解释成员变量构造函数`sumRange`方法注释版代码一维前缀和是处理数组区间求和问题的一种非常有效的方法。它通过预处理输入数组,使得任何区间的和都可以在常数时间内被计算......
  • 深入了解指针(3)【数组指针变量】【函数指针变量】【typedef关键字】
    一.数组指针变量1.什么是数组指针变量?说到数组指针,那必然要说一下指针数组,指针数组是什么呢?指针数组是一种数组,只不过这种数组存放的是地址(指针)。那把这两个词反过来,数组指针是什么?它是指针变量,还是数组?答案是:指针变量。这个指针有些特殊,它存放的是数组的地址,它是能够指向数......
  • css实现一个三排数组滚动抽奖
    简单理解可视化版本:<divclass="slot-machine"><divclass="reel"><div>Item1</div><div>Item2</div><div>Item3</div><div>Item1<......
  • Java基础知识篇04——数组
    哈喽,大家好!我是白夜,今天给大家聊聊数组。一、概念计算机在内存区域分配的一段连续的区域(空间),用来存储同种类型的多个数据简单的理解,数组就是一堆盒子,同一时间,可以保存多个相同数据类型的数据数组名:数组的名字数组元素:就是存放在数组里面的数据数组索引:就是数组里面连......
  • Go04-数组+切片+map
    Go4-数组+切片+map1.数组的定义、赋值、访问和遍历//1数组用来存放多个同一类型的数据,在Go中数组是值类型。//2数组的定义、赋值和遍历。//定义数字。vararrs[2]int//给数组元素赋值。arrs[0]=0arrs[1]=2//02fori:=0;i<len(arrs);i++{fmt.P......