【忍者算法】从购物清单到数组乘积:探索除自身外数组的乘积问题|LeetCode 238 除自身以外数组的乘积

从购物清单到数组乘积:探索除自身外数组的乘积问题

生活中的算法

想象你是一家糕点店的老板,今天要制作不同种类的蛋糕。每个蛋糕都需要面粉、鸡蛋、糖和黄油,但用量不同。比如:

  • 奶油蛋糕:2斤面粉,4个鸡蛋,1斤糖,0.5斤黄油
  • 巧克力蛋糕:1斤面粉,3个鸡蛋,1.5斤糖,1斤黄油
  • 水果蛋糕:3斤面粉,6个鸡蛋,2斤糖,1.5斤黄油

如果你想知道制作每种蛋糕时其他蛋糕总共需要多少原料,这就是一个典型的"除自身外的乘积"问题。比如计算奶油蛋糕之外的其他蛋糕需要的面粉总量:1 + 3 = 4斤。

这种计算在日常生活中很常见:比如计算团队中除某人外的总工时、计算除某个地区外其他地区的销售总额、或是计算除某天外其他天的平均温度等。

问题描述

LeetCode第238题"除自身以外数组的乘积"是这样描述的:给你一个整数数组 nums,返回一个新数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。题目要求不能使用除法。

例如:

输入:nums = [1,2,3,4]
输出:[24,12,8,6]
解释:
24 是除了 1 以外其他数的乘积 2×3×4
12 是除了 2 以外其他数的乘积 1×3×4
8 是除了 3 以外其他数的乘积 1×2×4
6 是除了 4 以外其他数的乘积 1×2×3

最直观的解法:两层循环

最容易想到的方法是:对每个位置,重新遍历一遍数组计算除自身外的乘积。这就像是为每种蛋糕都重新统计一遍其他蛋糕的原料用量。

让我们用一个简单的例子来理解:

数组:[2,3,4]
1. 计算索引0的结果:跳过2,计算3×4=12
2. 计算索引1的结果:跳过3,计算2×4=8
3. 计算索引2的结果:跳过4,计算2×3=6
最终结果:[12,8,6]

优化解法:前缀积和后缀积

仔细思考会发现,对于每个位置,我们其实可以把它左边所有数的乘积和右边所有数的乘积分开计算。这就像是提前准备好了两份清单:一份记录从左到右累积的原料用量,另一份记录从右到左累积的原料用量。

前后缀积的原理

  1. 先从左向右遍历,计算每个位置左边所有数的乘积
  2. 再从右向左遍历,计算每个位置右边所有数的乘积
  3. 两个乘积相乘就是答案

示例演示

用nums = [2,3,4,5]来说明:

1. 计算左边的乘积:left[0] = 1(没有左边的数)left[1] = 2left[2] = 2×3left[3] = 2×3×42. 计算右边的乘积:right[3] = 1(没有右边的数)right[2] = 5right[1] = 5×4right[0] = 5×4×33. 最终每个位置的结果是:result[0] = left[0] × right[0]result[1] = left[1] × right[1]result[2] = left[2] × right[2]result[3] = left[3] × right[3]

Java代码实现

public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] result = new int[n];// 计算左边的乘积result[0] = 1;  // 第一个数左边没有其他数for (int i = 1; i < n; i++) {result[i] = result[i-1] * nums[i-1];}// 从右向左遍历,同时计算右边的乘积int rightProduct = 1;for (int i = n-1; i >= 0; i--) {result[i] *= rightProduct;rightProduct *= nums[i];}return result;
}

解法比较

让我们比较这两种方法:

两层循环:

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)(不计算输出数组)
  • 优点:思路简单直观
  • 缺点:效率较低,特别是数组较大时

前后缀积:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(不计算输出数组)
  • 优点:高效且不需要额外空间
  • 缺点:思路稍难理解

思考启发

这道题告诉我们:

  1. 有时候把一个复杂的计算拆分成两部分会更简单
  2. 可以利用输出数组来存储中间结果
  3. 从不同方向遍历数组可能会带来新的思路
  4. 预处理数据有时候能大大提高效率

类似的问题还有:

  • 数组的前缀和
  • 接雨水
  • 柱状图中的最大矩形

小结

通过除自身以外数组的乘积这道题,我们学会了如何巧妙地利用前后缀积来优化计算。这种思维方式不仅适用于这道题,在处理需要考虑元素两侧信息的问题时都很有用。记住,当遇到需要对数组进行乘积运算的问题时,考虑是否可以利用前后缀的思想来简化计算!


作者:忍者算法
公众号:忍者算法

🎯 回复【刷题清单】获取更多经典题目解析
👥 回复【加群】加入算法/面试交流群,一起学习进步
🧑‍💻 回复【代码】获取GitHub完整题解项目,包含Java/Python/JavaScript/Go/C++多语言实现

算法面试 #LeetCode #数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879329.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人英语学习笔记基于B站英语的平行世界语法课程

导读 语言学习没有捷径,只要听说读写这四大行长期日复一日的练习就行了,兴趣是最重要的,兴趣就是高效学习的基础和长期坚持下去的动力。 0基础开始痛苦学习大半年英语,没兴趣的结果就是词汇量是上去了,但是英语的听说读写水平还不如学了一年的日语。😅 该笔记基于此课程…

PostgreSQL:数据库迁移与版本控制

title: PostgreSQL:数据库迁移与版本控制 date: 2025/2/6 updated: 2025/2/6 author: cmdragon excerpt: 在现代软件开发中,数据库作为应用程序的核心组件之一,数据的结构和内容必须能够随着业务需求的变化而调整。因此,数据库迁移和版本控制成为了确保数据一致性、完整性…

Servlet基础

什么是Servlet、Servlet的架构、Servlet任务、Servlet的基本使用、Servlet的生命周期、Servlet API中主要接口及实现类、Servlet的部署(注册与映射)、缺省Servlet与启动时加载配置、ServletConfig与ServletContext、request和response什么是Servlet基础 Java Servlet 是运行在…

GNURadio模块学习——Source and Sink类

介绍GNU Radio中常见的 Source 与 Sink 模块,包括流程图端口、音频输入输出、虚拟连接、文件读写、ZMQ跨流程图通信,以及随机信号源、固定信号源、噪声源等常见信号源和时域、频域、星座图等信号展示工具。Source and Sink Pad(流程图端口) 当该流程图是hierarchical block…

【C++】gflag使用指南

一、什么是gflags? gflags 是一个用于定义命令行参数的 C++ 库,它由 Google 开发并开源。通过 gflags,你可以轻松地在你的程序中添加各种类型的命令行选项,包括整数、布尔值、字符串等,并且可以为这些选项设置默认值。此外,gflags 还提供了强大的帮助信息生成功能,使得用…

【C++】Google benchmark理解与应用

一、介绍 Google Benchmark 是一个用于 C++ 的微基准测试库。它旨在帮助开发者编写出更高效、更具表现力的基准测试代码。通过使用 Google Benchmark,可以方便地测量函数或代码片段的性能,并且能够生成详细的报告。 二、安装与配置 2.1 安装 在Ubuntu环境中安装Google Benchm…

LRU浅析

LRU算法LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使…

20250205 省选模拟赛 T3

20250205 省选模拟赛 T3 Description 设计一个 \(n\times n\) 的 01 矩阵,使得从 \((1,1)\) 走到 \((n,n)\) 且只能向右或下走且只经过为 \(1\) 的格子的方案数为 \(X\)。 \(n \leq 24\) 时得满分。\(X \leq 10^9\)。 Solution 基于 \(2\) 进制的构造方法我们称从左上到右下的…

Automa:自动化浏览器工作流

🏷️仓库名称:AutomaApp/automa 🌟截止发稿星数: 14340 (今日新增:33) 🇨🇳仓库语言: Vue 🤝仓库开源协议:Other 🔗仓库地址:https://github.com/AutomaApp/automa引言 Automa是一个浏览器扩展,允许用户通过连接模块来自动化浏览器任务。它消除了重复性任务的需…

本地部署DeepSeek教程

本地部署DeepSeek教程 步骤 本地部署DeepSeek教程步骤 1 安装Ollama 2 下载DeepSeek模型 3 可视化图文交互界面Chatbox(可选)1 安装Ollama 访问Ollama官网下载Ollama,默认安装即可。安装完成后打开终端(我这里是windows系统),输入: ollama help即可查看ollama选项,且可…

OpenLDAP篇-安装OpenLDAP服务01

1、OpenLDAP统⼀⽤户认证系统 1.1 为什么需要OpenLDAP 在没有OpenLDAP统⼀⽤户认证系统的环境中,往往会⾯临如下问题:1、当⽤户需要访问多台服务器时,管理员需要在每台服务器上⼿动创建账户。如果员⼯离职,还需逐台删除账户,整体操作繁琐且容易出现遗漏的情况,因此存在较…

集训3 20240127

集训3 20240127 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A: 题目大意:给定 \(n\) ,两个人轮流可以使 \(n\) 减去一个任意小于它且与它互质的数,求最后甲能否取胜 #include<bits/stdc++.h>using namespace std;int main() {long long n;cin&g…