【LeetCode最详尽解答】238.除自身以外数组的乘积 Product-of-Array-Except-Self

2024-06-12 09:20

本文主要是介绍【LeetCode最详尽解答】238.除自身以外数组的乘积 Product-of-Array-Except-Self,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家!

链接:

  • 238_除自身以外数组的乘积

直觉

这个问题有点棘手,我看了 Neetcode 的解释。Neetcode 非常聪明。

给定输入: nums = [1,2,3,4]

预期输出是: [24,12,8,6]

首先,我们需要构建一个结果数组来存储每个乘积值。这个数组的长度与 nums 相同。例如:

  • 对于 1,乘积是 2 × 3 × 4
  • 对于 2,乘积是 1 × 3 × 4
  • 对于 3,乘积是 1 × 2 × 4
  • 对于 4,乘积是 1 × 2 × 3

我们可以注意到,数组是根据我们要知道其乘积的值分成两部分的。所以,我们可以计算前缀乘积和后缀乘积,然后将它们相乘。

对于前缀乘积,我们可以将其初始化为 1,并在遍历整个数组时更新其值。我们将计算每个位置的前缀乘积值。怎么做呢?res[i] = prefix,然后 prefix *= nums[i]。这意味着每次我们到达 nums[i] 时,前缀已经是我们可以直接使用并更新的前缀乘积值。

对于后缀乘积,我们也可以将其初始化为 1,并应以相反的顺序计算。此时,res 已经填充了前缀乘积值。然后,对于后缀乘积,我们将更新 res[i] *= postfix,然后更新 postfix *= nums[i]

方法

构建一个结果数组,其初始值为 [1] * len(nums),用于存储每个数字的乘积值。乘积分为前缀和后缀。在这种情况下,前缀将初始化为 1,我们将遍历整个数组以更新结果数组和前缀值。同样,后缀将初始化为 1,我们将以相反的顺序遍历整个数组以更新结果数组和后缀值。

复杂度

  • 时间复杂度:
    O ( n ) O(n) O(n)

    • 时间复杂度是 O ( n ) O(n) O(n),因为我们遍历数组两次:一次计算前缀乘积,一次计算后缀乘积。每次遍历的时间复杂度都是线性的。
  • 空间复杂度:
    O ( n ) O(n) O(n)

    • 空间复杂度是 O ( n ) O(n) O(n),因为我们使用了一个与输入数组 nums 长度相同的额外数组 res 来存储结果。前缀和后缀变量使用的空间是常数,但额外的结果数组使空间复杂度为线性。

代码

class Solution(object):def productExceptSelf(self, nums):""":type nums: List[int]:rtype: List[int]"""res = [1] * len(nums)prefix = 1for i in range(len(nums)):res[i] = prefixprefix *= nums[i]postfix = 1for i in range(len(nums)-1,-1,-1):res[i]*=postfix  postfix*=nums[i]return res

这篇关于【LeetCode最详尽解答】238.除自身以外数组的乘积 Product-of-Array-Except-Self的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053816

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,