除自身以外数组的乘积-leetcode

news/2025/9/18 20:57:16/文章来源:https://www.cnblogs.com/foxt/p/19099711

题目描述

给你一个整数数组 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]

提示:

  • 2 <= nums.length <= 105
  • -30 <= nums[i] <= 30
  • 输入 保证 数组 answer[i]32 位 整数范围内

进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)

解法一

思路:

利用前缀乘积和后缀乘积的方法进行求解,例如L[i]i的左侧所有数乘积,R[i]i的右侧所有数乘积,那么对于answer[i]则为L[i-1]*R[i+1],同时L数组计算时间复杂度为O(n),从左向右遍历,R数组也是同理。

代码:

class Solution {public int[] productExceptSelf(int[] nums) {int numsLen=nums.length;int[] res=new int[numsLen];//前缀和后缀乘积int[] prefix=new int[numsLen+2];int[] suffix=new int[numsLen+2];Arrays.fill(prefix,1);Arrays.fill(suffix,1);for(int i=1;i<=numsLen;i++){suffix[i]=nums[i-1]*suffix[i-1];}for(int i=numsLen;i>0;i--){prefix[i]=nums[i-1]*prefix[i+1];}for(int i=1;i<=numsLen;i++){res[i-1]=prefix[i+1]*suffix[i-1];}return res;}
}

解法二

思路:

来自官方解答。尽管上面的方法已经能够很好的解决这个问题,但是空间复杂度并不为常数。

由于输出数组不算在空间复杂度内,那么我们可以将 L 或 R 数组用输出数组来计算。先把输出数组当作 L 数组来计算,然后再动态构造 R 数组得到结果。让我们来看看基于这个思想的算法。

步骤:

  • 初始化 answer 数组,对于给定索引 i,answer[i] 代表的是 i 左侧所有数字的乘积。
  • 构造方式与之前相同,只是我们试图节省空间,先把 answer 作为方法一的 L 数组。
  • 这种方法的唯一变化就是我们没有构造 R 数组。而是用一个遍历来跟踪右边元素的乘积。并更新数组 answer[i]=answer[i]∗R。然后 R 更新为 R=R∗nums[i],其中变量 R 表示的就是索引右侧数字的乘积

代码:

class Solution {public int[] productExceptSelf(int[] nums) {int length = nums.length;int[] answer = new int[length];// answer[i] 表示索引 i 左侧所有元素的乘积// 因为索引为 '0' 的元素左侧没有元素, 所以 answer[0] = 1answer[0] = 1;for (int i = 1; i < length; i++) {answer[i] = nums[i - 1] * answer[i - 1];}// R 为右侧所有元素的乘积// 刚开始右边没有元素,所以 R = 1int R = 1;for (int i = length - 1; i >= 0; i--) {// 对于索引 i,左边的乘积为 answer[i],右边的乘积为 Ranswer[i] = answer[i] * R;// R 需要包含右边所有的乘积,所以计算下一个结果时需要将当前值乘到 R 上R *= nums[i];}return answer;}
}

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

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

相关文章

【2022】SDRZ夏令营游记

为什么2022的游记会在2025年发? 因为感觉洛谷博客快扛不住了,决定开始搬运。今天是夏令营最后一天了,在机房里坐不住了,写篇游记来纪念一下。 day0: 这天是gryz65级三个校区的信竞同学第一次大会师。我成功与一区…

rapidXML解析xml文件

1.rapidXML介绍 RapidXML 是一个轻量级、高性能的 XML 解析库,以单头文件形式提供(rapidxml.hpp 及辅助头文件),适合在 C++ 中解析中小型 XML 文档。获取 RapidXML:从 官方网站 下载头文件(rapidxml.hpp、rapidx…

2025.9.17 - 呓语

今天在Ubuntu虚拟机上安装配置了Hadoop,Hbase和ZooKeeper下面开始idea连接虚拟机Hbase. 1、在Hbase里创建StudentAndCourse表: (1)启动Hadoop(2)启动Hbase(3)进入shell界面(4)创建表(5)插入数据(6)查看表数据2、id…

office2024免费永久激活版下载安装教程:含激活步骤 + 一键安装包下载

目录一、 Office 2024 专业增强版介绍二、Office 2024 专业增强版核心功能(每个组件都好用)1.Word 2024:写文档再也不用熬夜改格式2.Excel 2024:处理数据超省心三、Office 2024 专业增强版下载渠道(正规才安全,避…

大学不止GPA

🎊精彩预告~~~在这个各类奖项进行评比的时间点,我没得到很好的结果,没有多少经济实力的我,却花了2个月生活费的价钱,买下了大疆Action 5 Pro。📸 上了大学之后,感觉自己反而很少得到来自外界的肯定。我想,有…

大学目标

一、自我介绍:从好奇到尝试 哈喽~我是王星星,一名大数据技术专业的学生。和很多 “一开始就目标明确” 的同学不同,我更像个在代码世界里 “逛园子” 的人 —— 对技术充满好奇,但还在摸索最感兴趣的方向。不过,…

福昕PDF编辑器专业版破解 v2025 中文版安装使用教程

福昕PDF编辑器专业版破解 v2025 中文版安装使用教程福昕高级pdf编辑器介绍 可以对PDF文件进行多种 创建、转换、打印、编辑、注释、表单处理、签名、保护、协同合作 等工作,强大的编辑套件让本身不可以编辑的PDF格式文…

MySQL LIMIT 和 ORDER BY 优化详解

MySQL LIMIT 和 ORDER BY 优化详解MySQL LIMIT 子句 MySQL LIMIT 子句是控制 SELECT 语句返回行数的重要工具。通过指定从结果集中获取的最大行数,它可以让你处理数据子集,尤其是在涉及大表的情况下。该功能可提高查…

python 架构专业的技术50

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[论文笔记/评估方法] RELIABLE AND DIVERSE EVALUATION OF LLM MEDICAL KNOWLEDGE MASTERY

RELIABLE AND DIVERSE EVALUATION OF LLM MEDICAL KNOWLEDGE MASTERY该文章于2025年发表在ICLR(CCF A),早在2024年9月发布在arxiv。 文章地址:Reliable and Diverse Evaluation of LLM Medical Knowledge Mastery …

本地VMware Workstation Pro的rhel-server-7.9-x86_64服务器配置本地源

1. 安装好VMware Workstation Pro以及rhel-server-7.9-x86_64-dvd.iso后 2. 先对VMware Workstation 进行虚拟机关机 3. 对虚拟机的CD/DVD(SATA) 勾选设备状态为启动时连接,以及连接中勾选使用ISO镜像文件,为本地的r…

SCPI 标准命令

SCPI 标准命令*IDN? 是 SCPI 标准命令之一,用来返回仪器的身份信息。 📌 背景SCPI(Standard Commands for Programmable Instruments,标准可编程仪器命令)是 1990 年制定的一套通用指令集,几乎所有可编程仪器(…

前端,真的让我深刻感受到信息闭塞的恐怖 - 指南

前端,真的让我深刻感受到信息闭塞的恐怖 - 指南2025-09-18 20:34 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

05-条件查询

05-条件查询$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");介绍 通常在进行查询操作的时候,都是查询符合某些条件的数据,很少将表中所有数据都取出来。怎…

2025年十大AI网站构建工具:专家评测与推荐!

2025年,软件开发领域迎来一个关键转折点。随着 AI 技术的飞速发展,传统的网站或应用构建障碍正逐渐消失。市场上涌现出大量功能强大的工具,每一个都号称是您所需要的最佳 AI网站构建器 或 网站生成器。 然而,对于开…

扫描线乱谈

扫描线乱谈前置知识 离散化,线段树 扫描线 首先假设你有n个矩形。如果直接暴力求解这些矩形的覆盖面积肯定不行,这时就要用扫描线算法。 假设有一根线,从下往上扫描:把每个小矩形分成很多不同的块,高是扫过的距离…

详细介绍:量子计算学习(第十四周周报)

详细介绍:量子计算学习(第十四周周报)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

视频播放时切出页面视频暂停(亲测可用)

视频播放时切出页面视频暂停(亲测可用)谷歌浏览器方法:视频播放网页,右键—检查—Elements—Event Listeners—找到blur,点开小三角,remove掉所有子元素

VulkanAPI细节梳理1

1. PSOPipeline State Object,管线状态对象)? PSO 是 Vulkan 的核心概念之一,它是一个包含了渲染所需几乎所有状态的、不可变的对象。你可以把它想象成一台高度可配置的工业机器(GPU)的完整配置方案。在传统 API…

Win11 安装 MinGW

下载:https://github.com/niXman/mingw-builds-binaries/releases或者: 链接: https://pan.baidu.com/s/18nbkKpwnbrNenan9LLEUCA?pwd=twym 提取码: twym解压出来:添加环境变量:验证: