算法的学习笔记— 构建乘积数组(牛客JZ66)

构建乘积数组

1. 问题背景与描述

1.1 题目来源与链接

本题来源于NowCoder在线编程平台,是剑指Offer系列面试题中的经典问题。题目链接为:NowCoder。该问题在算法面试中出现频率较高,主要考察数组操作和数学思维。

1.2 问题描述与要求

给定一个数组A[0, 1,…, n-1],需要构建一个数组B[0, 1,…, n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。即B[i]是数组A中除A[i]外所有元素的乘积。要求实现一个时间复杂度为O(n)的算法,且不能使用除法运算。

在这里插入图片描述

1.3 问题限制条件

  1. 时间复杂度要求:必须在O(n)时间内完成计算
  2. 空间复杂度要求:除返回的数组B外,只能使用常数级别的额外空间
  3. 运算限制:禁止使用除法运算
  4. 输入范围:数组长度n满足1 ≤ n ≤ 10^5,数组元素为整数且绝对值不超过100

2. 解题思路分析

2.1 从左往右累乘的逻辑

从左往右累乘的核心思想是计算每个位置左侧所有元素的乘积。具体步骤如下:

  1. 初始化一个数组left,其中left[0] = 1
  2. 遍历数组,对于每个位置ileft[i] = left[i-1] * A[i-1]
  3. 最终left数组存储了每个位置左侧所有元素的乘积

在这里插入图片描述

2.2 从右往左累乘的逻辑

从右往左累乘的核心思想是计算每个位置右侧所有元素的乘积。具体步骤如下:

  1. 初始化一个数组right,其中right[n-1] = 1
  2. 从右向左遍历数组,对于每个位置iright[i] = right[i+1] * A[i+1]
  3. 最终right数组存储了每个位置右侧所有元素的乘积

在这里插入图片描述

2.3 综合累乘结果的计算

将左右累乘的结果相乘,即可得到最终结果数组B。具体步骤如下:

  1. 初始化结果数组B,其中B[i] = left[i] * right[i]
  2. 遍历数组,计算每个位置的最终乘积
  3. 返回结果数组B

在这里插入图片描述

3. 代码实现与解析

public int[] multiply(int[] A) {int n = A.length;int[] B = new int[n];for (int i = 0, product = 1; i < n; product *= A[i], i++)       /* 从左往右累乘 */B[i] = product;for (int i = n - 1, product = 1; i >= 0; product *= A[i], i--)  /* 从右往左累乘 */B[i] *= product;return B;
}

3.1 代码结构与变量定义

代码采用模块化设计,主要包含以下变量:

  1. nums:输入数组,存储原始数据
  2. left:从左往右累乘的结果数组
  3. right:从右往左累乘的结果数组
  4. result:最终返回的结果数组

3.2 从左往右累乘的实现

从左往右累乘的实现逻辑如下:

  1. 初始化left[0] = 1
  2. 使用for循环遍历数组,计算left[i] = left[i-1] * nums[i-1]
  3. 时间复杂度为O(n),空间复杂度为O(n)

3.3 从右往左累乘的实现

从右往左累乘的实现逻辑如下:

  1. 初始化right[n-1] = 1
  2. 使用for循环从右向左遍历数组,计算right[i] = right[i+1] * nums[i+1]
  3. 时间复杂度为O(n),空间复杂度为O(n)

3.4 返回结果的处理

最终结果的处理逻辑如下:

  1. 初始化result数组
  2. 遍历数组,计算result[i] = left[i] * right[i]
  3. 返回result数组
  4. 时间复杂度为O(n),空间复杂度为O(1)

4. 复杂度分析与优化

4.1 时间复杂度分析

算法的时间复杂度主要来源于以下三个部分:

  1. 从左往右累乘:O(n)
  2. 从右往左累乘:O(n)
  3. 结果计算:O(n)
    总时间复杂度为O(n),其中n为输入数组的长度。
xychart-betatitle "时间复杂度随输入规模变化趋势"x-axis ["n=10", "n=100", "n=1000", "n=10000", "n=100000"]y-axis "时间(ms)" 0 --> 10line [0.1, 1.0, 10.0, 100.0, 1000.0]

4.2 空间复杂度分析

算法的空间复杂度分析如下:

  1. left数组:O(n)
  2. right数组:O(n)
  3. result数组:O(n)
    总空间复杂度为O(n),其中n为输入数组的长度。
    在这里插入图片描述

4.3 可能的优化方向

针对当前算法,提出以下优化方向:

  1. 空间优化:使用单个数组存储中间结果,将空间复杂度降低到O(1)
  2. 并行计算:利用多核处理器并行计算左右累乘,提升计算效率
  3. 缓存优化:优化数据访问模式,提高缓存命中率

5. 应用场景与扩展

5.1 实际应用场景

该算法在以下实际场景中具有广泛应用:

  1. 图像处理:用于像素值的局部加权计算,提升图像处理效率
  2. 金融分析:用于计算股票收益率的累积乘积,辅助投资决策
  3. 数据科学:用于特征工程中的特征缩放和归一化处理

5.2 类似问题的扩展

该算法可扩展应用于以下类似问题:

  1. 前缀和计算:将乘积运算替换为求和运算
  2. 滑动窗口统计:用于计算窗口内的统计量
  3. 多维数组处理:扩展到二维或三维数组的累积计算

5.3 与其他算法的对比

与其他相关算法的对比分析如下:

  1. 时间复杂度:优于暴力解法的O(n²),与分治法相当
  2. 空间复杂度:优于递归解法,与迭代解法相当
  3. 适用性:比专用算法更具通用性,但效率略低

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

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

相关文章

SpringBoot+ELK 搭建日志监控平台

ELK 简介 ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;是一个目前主流的开源日志监控平台。由三个主要组件组成的&#xff1a; Elasticsearch&#xff1a; 是一个开源的分布式搜索和分析引擎&#xff0c;可以用于全文检索、结构化检索和分析&#xff0c;它构建…

python36

仔细回顾一下神经网络到目前的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a;对之前的信贷项目&#xff0c;利用神经网络训练下&#xff0c;尝试用到目前的知识点让代码更加规范和美观。 # 先运行之前预处理好的代码 import pandas as pd import pandas as pd…

SGlang 推理模型优化(PD架构分离)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;广泛应用于搜索、内容生成、AI助手等领域&#xff0c;对模型推理服务的并发能力、响应延迟和资源利用效率提出了前所未有的高要求。与模型训练相比&#xff0c;推理是一个持续进行、资源消耗巨大的任务&#xff0c;尤…

模型实战(28)之 yolov5分类模型 训练自己的数据集

模型实战(28)之 yolov5分类模型 训练自己的数据集 本文以手写数字数据集为例总结YOLO分类模型如何训练自己的数据集,关于数据集的预处理可以看这篇:https://blog.csdn.net/yohnyang/article/details/148209978?spm=1001.2014.3001.5502 yolov5曾是在 2021-2023 年十分流行…

医学写作人才管理策略

1. 人才选择:精准定位核心能力 1.1 人才筛选标准 1.1.1 硬性要求 初创生物制药公司医学写作岗位对专业背景要求严格,候选人需具备医学、药学或生物学硕士及以上学历,博士优先。同时,熟悉ICH、FDA/EMA等法规指南是必备条件,且至少有1-3年医学写作经验,或相关领域如临床研…

Axure酒店管理系统原型

酒店管理系统通常被设计为包含多个模块或界面&#xff0c;以支持酒店运营的不同方面和参与者。其中&#xff0c;管理端和商户端是两个核心组成部分&#xff0c;它们各自承担着不同的职责和功能。 软件版本&#xff1a;Axure RP 9 预览地址&#xff1a;https://556i1e.axshare.…

云原生安全之HTTP协议:从基础到实战的安全指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念&#xff1a;HTTP协议的核心要素 HTTP&#xff08;HyperText Transfer Protocol&#xff09;是云原生应用中客户端与服务器通信的基础协议&a…

怎样解决photoshop闪退问题

检查系统资源&#xff1a;在启动 Photoshop 之前&#xff0c;打开任务管理器检查 CPU 和内存的使用情况。如果发现资源占用过高&#xff0c;尝试关闭不必要的程序或重启计算机以释放资源。更新 Photoshop 版本&#xff1a;确保 Photoshop 是最新版本。Adobe 经常发布更新以修复…

修复ubuntu server笔记本合盖导致的无线网卡故障

下班回到家发现走时还好的局域网 ubuntu server 24 连不上了&#xff0c;赶紧打开笔记本查看下原因&#xff0c;发现控制台出了一堆看不懂的内容&#xff1a; 根据搜索结果&#xff0c;笔记本合盖导致无线网卡故障可能与电源管理设置和系统休眠策略有关&#xff0c;以下是具体…

CMake指令:find_package()在Qt中的应用

目录 1.简介 2.Qt 核心组件与常用模块 3.配置模式的工作流程 4.完整示例&#xff1a;构建 Qt GUI 应用 5.常见问题与解决方案 6.总结 1.简介 在 CMake 中使用 find_package(Qt) 是集成 Qt 库的核心步骤。Qt 从 5.x 版本开始全面支持 配置模式&#xff08;Config Mode&…

Docker 镜像调试最佳实践

当你已经构建了一个 Docker 镜像&#xff0c;但运行它的容器启动后立即退出&#xff08;通常是因为服务异常或配置错误&#xff09;&#xff0c;你仍然可以通过以下几种方式进入镜像内部进行调试。 ✅ 最佳实践&#xff1a;如何对一个“启动即退出”的镜像进行命令行调试&#…

使用Java制作贪吃蛇小游戏

在这篇文章中&#xff0c;我将带你一步步实现一个经典的贪吃蛇小游戏。我们将使用Java语言和Swing库来构建这个游戏&#xff0c;它包含了贪吃蛇游戏的基本功能&#xff1a;蛇的移动、吃食物、计分以及游戏结束判定。 游戏设计思路 贪吃蛇游戏的基本原理是&#xff1a;玩家控制…

【linux】umask权限掩码

umask这个接口在一些程序初始化的时候经常会见到&#xff0c;处于安全性&#xff0c;可以缩小进程落盘文件的权限。 1、linux文件系统的权限规则 文件的默认权限由系统决定&#xff08;通常是 0666&#xff0c;即所有人可读可写&#xff09;。 目录的默认权限通常是 0777&am…

esp32cmini SK6812 2个方式

1 #include <SPI.h> // ESP32-C系列的SPI引脚 #define MOSI_PIN 7 // ESP32-C3/C6的SPI MOSI引脚 #define NUM_LEDS 30 // LED灯带实际LED数量 - 确保与实际数量匹配&#xff01; #define SPI_CLOCK 10000000 // SPI时钟频率 // 颜色结构体 st…

互联网大厂Java求职面试:Spring Cloud微服务架构设计中的挑战与解决方案

互联网大厂Java求职面试&#xff1a;Spring Cloud微服务架构设计中的挑战与解决方案 面试场景设定 郑薪苦是一位拥有丰富实战经验的Java开发者&#xff0c;他正在参加一场由某知名互联网大厂的技术总监主持的面试。这场面试将围绕Spring Cloud微服务架构展开&#xff0c;涵盖…

品鉴JS的魅力之防抖与节流【JS】

前言 小水一波&#xff0c;函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑&#xff0c;在我们的日常开发中&#xff0c;有着一定的地位。 防抖和节流是两种常用的性能优化技术&#xff0c;用于限制某个函数在一定时间内被触发的次数,减少不…

# 使用 Hugging Face Transformers 和 PyTorch 实现信息抽取

使用 Hugging Face Transformers 和 PyTorch 实现信息抽取 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;信息抽取是一种常见的任务&#xff0c;其目标是从文本中提取特定类型的结构化信息。本文将介绍如何使用 Hugging Face Transformers 和 PyTorch 实现基于大…

Firecrawl MCP Server 深度使用指南

无论是市场分析师洞察行业动态、研究者收集学术资料&#xff0c;还是开发者为智能应用采集数据&#xff0c;都对网络数据采集工具提出了极高的要求。Firecrawl MCP Server 应运而生&#xff0c;它宛如一把犀利的 “数字手术刀”&#xff0c;能够精准地剖析网页&#xff0c;为用…

OceanBase数据库全面指南(基础入门篇)

文章目录 一、OceanBase 简介与安装配置指南1.1 OceanBase 核心特点1.2 架构解析1.3 安装部署实战1.3.1 硬件要求1.3.2 安装步骤详解1.3.3 配置验证二、OceanBase 基础 SQL 语法入门2.1 数据查询(SELECT)2.1.1 基础查询语法2.1.2 实际案例演示2.2 数据操作(INSERT/UPDATE/DE…

几种环境下的Postgres数据库安装

1. Postgres 数据库介绍 PostgreSQL&#xff08;又称 Postgres&#xff09;是一种强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它具备高度的可靠性、稳定性和可扩展性&#xff0c;主要特点如下&#xff1a; 开源&#xff1a;PostgreSQL 是基于开…