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

目录

  • 题目
  • 解法
      • 思路:
      • 步骤:
      • 代码实现:
      • 解释:
      • 示例:
      • 输出:
  • 除nums[i]之外的其他数如何快速找到其索引,不用遍历的方法?
  • 前缀积是什么?
  • 为什么会想到前缀积和后缀积的方法?

题目

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

解法

这个问题要求我们计算一个数组 answer,其中每个元素 answer[i] 是数组 nums 中除 nums[i] 以外的所有元素的乘积,且不能使用除法,并要求时间复杂度为 O(n)。我们可以使用前缀积和后缀积的技巧来高效地解决问题。

思路:

  1. 前缀积:对于每个位置 i,计算它左边所有元素的乘积。
  2. 后缀积:对于每个位置 i,计算它右边所有元素的乘积。
  3. 最终结果:对于每个位置 i,结果 answer[i] 就等于它左边的前缀积乘以右边的后缀积。

通过这种方式,我们可以避免直接使用除法。

步骤:

  1. 创建一个 answer 数组,首先存储每个位置的前缀积。
  2. 再遍历数组,从右向左计算后缀积,并同时更新 answer 数组中的结果。

代码实现:

#include <iostream>
#include <vector>std::vector<int> productExceptSelf(const std::vector<int>& nums) {int n = nums.size();std::vector<int> answer(n, 1);  // 初始化结果数组,所有元素设为 1// 计算前缀积for (int i = 1; i < n; ++i) {answer[i] = answer[i - 1] * nums[i - 1];  // 当前元素存放左边所有元素的乘积}// 计算后缀积并同时更新结果数组int suffix = 1;  // 记录后缀积for (int i = n - 1; i >= 0; --i) {answer[i] = answer[i] * suffix;  // 将前缀积乘以后缀积suffix *= nums[i];  // 更新后缀积}return answer;
}int main() {std::vector<int> nums = {1, 2, 3, 4};std::vector<int> result = productExceptSelf(nums);// 输出结果for (int num : result) {std::cout << num << " ";}return 0;
}

解释:

  1. 前缀积部分

    • 从左到右遍历数组,answer[i] 存储的是 nums 数组中第 i 个元素左侧所有元素的乘积。
    • 例如对于 nums = {1, 2, 3, 4},计算完前缀积后的 answer 数组是 {1, 1, 2, 6}
  2. 后缀积部分

    • 从右到左遍历数组,同时维护一个变量 suffix,它表示当前元素右侧所有元素的乘积。
    • 在每一步中,answer[i] 会乘以 suffix,并更新 suffix 为当前元素的乘积。

示例:

假设 nums = {1, 2, 3, 4},执行过程如下:

  • 前缀积计算后:

    • answer = {1, 1, 2, 6}
  • 后缀积计算后:

    • 计算从右往左:
      • suffix = 1,初始值,乘以 answer[3] = 6,更新 suffix = 4
      • suffix = 4,乘以 answer[2] = 2,更新 suffix = 12
      • suffix = 12,乘以 answer[1] = 1,更新 suffix = 24
      • suffix = 24,乘以 answer[0] = 1

最终得到结果:answer = {24, 12, 8, 6}

输出:

24 12 8 6

这个解法的时间复杂度为 O(n),并且不使用除法,符合题目的要求。

除nums[i]之外的其他数如何快速找到其索引,不用遍历的方法?

不遍历索引,保存中间结果

前缀积是什么?

在这里插入图片描述
前缀的部分是共通的都需要计算的部分,该处可以优化。

为什么会想到前缀积和后缀积的方法?

直接通过两重循环来计算每个元素的乘积是一个最直观的方法。即,对于每个元素 i,我们循环遍历数组,将 nums[i] 之外的所有元素相乘。这种方法的时间复杂度是 O(n^2),在大数组情况下效率低。
这种思路来源于分治和局部积累的思想:

分治思想:我们知道对于每个位置 i,答案可以看成两部分,左边和右边的元素。通过分别计算这两部分,我们将整体问题分解成局部问题。

局部积累:通过一次遍历计算前缀积,我们就能得到每个位置左边的所有元素的乘积。而从右到左遍历时,用后缀积乘以前缀积,直接得到结果。这种方法有效利用了已经计算的信息,没有多余的计算,保持 O(n) 时间复杂度。

这个前缀积和后缀积有点像累加和这种,过程变量,来进行局部积累。利用已经计算的信息
前缀积和后缀积的技巧是一种常见的前缀和后缀动态编程思想,适用于类似「除去某个位置的计算」问题。通过将问题分为左右两部分,我们能够避免多次遍历,达到线性时间复杂度。

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

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

相关文章

ssm医院交互系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

录微课专用提词器,不会被录进视频中的提词器,还能显示PPT中备注的内容

不坑提词器&#xff0c;全称&#xff1a;不坑隐形提词器。是一款能够在截图、录屏、直播过程中隐藏界面的提词器软件。 系统要求&#xff1a;Win10 1024 以上&#xff08;特别提醒&#xff1a;Win7状态下不可隐身&#xff09; ⏬下载 提词器默认放在不坑盒子的安装目录下&…

MySQL—事务

目录 1.事务的简介&#xff1a; 2.使用事务 2.1 开启事务 2.2 自动提交 2.3 使用范围 2.4 事务的属性 1.事务的简介&#xff1a; 介绍事务之前&#xff0c;我们先来看一个经典的场景&#xff1a;银行转账。 假如a想要把自己的账户上的10万块钱转到b账户上&#xff0c;这…

实现uniapp天地图边界范围覆盖

前言&#xff1a; 在uniapp中&#xff0c;难免会遇到使用地图展示的功能&#xff0c;但是百度谷歌这些收费的显然对于大部分开源节流的开发者是不愿意接受的&#xff0c;所以天地图则是最佳选择。 此篇文章&#xff0c;详细的实现地图展示功能&#xff0c;并且可以自定义容器宽…

Win10、Win11一段时间不操作电脑,屏幕点击无反应假死,粘贴失效,任务栏失效等解决方法

网上找到的方法基本都是说在任务管理器中找到资源管理器的进程进行重启即可&#xff0c;这样确实能解决燃眉之急&#xff0c;可是这个问题还是会反反复复出现&#xff0c;无法根治。 本人测试了多种方案后&#xff0c;最终发现设置电源选项的硬盘关闭时间可以根治此问题。 设置…

Scala的内部类

Scala中的内部类&#xff08;Inner Class&#xff09;是指定义在另一个类的内部的类。 内部类可以访问外部类的成员&#xff08;包括私有成员&#xff09;&#xff0c;并且可以与外部类的实例紧密地绑定在一起。 内部类在Scala中非常有用&#xff0c;尤其是在需要封装特定功能…

企业一级流程架构规划方法

在之前关于企业业务流程规划的系列文章中&#xff0c;我们已经分别对企业业务流程规划的价值和原则、企业的业务流程架构的应用、两种常见的企业总体业务流程架构模式等进行了比较深入的分析和阐述&#xff0c;相信大多数企业同仁&#xff0c;已经对企业的业务流程规划&#xf…

【原创】java+springboot+mysql在线文件管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

ubuntu下安装mysql遇到的问题

ubuntu下安装mysql sudo apt install -y mysql-server 出现问题 ……by process 3455 解决 安装 启动 systemctl status mysql.service sudo mysql -u root -p 如何修改密码 与datagrip的连接 查看IP ifconfig 若没安装 参考 Windows10的DataGrip2024.1.4连接ubuntu22.04中的M…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题

一、项目简介 使用过ABP框架的童鞋应该知道它也自带了一款免费的Blazor UI主题&#xff0c;它的页面是长这样的&#xff1a; 个人感觉不太美观&#xff0c;于是网上搜了很多Blazor开源组件库&#xff0c;发现有一款样式非常不错的组件库&#xff0c;名叫&#xff1a;Radzen&am…

【Linux系统编程】第三十四弹---使用匿名管道构建简易Linux进程池

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、引言 2、进程池的基本概念 3、管道在进程池中的应用 4、进程池的实现 4.1、master类定义 4.2、测试信道 4.3、通过cha…

一文读懂JPA及Mybatis的原理和机制(面试经)

导览 前言Q&#xff1a;什么是JPA1. 简介2. 原理 Q&#xff1a;JPA持久化框架—Mybatis1. 内部组成与关系2. 各组件作用域和生命周期3. 动态SQL3.1 if语句3.2 choose-when-otherwise 4. mapper映射XML4.1 select4.2 insert 5. $与#的区别5.1 #{...}5.2 ${...} 结语精彩回顾 前言…

明日周刊-第23期

十月已过半&#xff0c;气温也转凉了&#xff0c;大家注意保温哦。冬吃萝卜&#xff0c;夏吃姜&#xff0c;在快要到来的冬季大家可以选择多吃点萝卜。 配图是本周末去商场抓娃娃的时候拍的照片&#xff0c;现在抓娃娃单次普遍都控制在1块钱以下了&#xff0c;还记得多年前的抓…

qt继承结构

一、 继承结构 所有的窗口类均继承自QWidget类&#xff0c;因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口&#xff0c;又可以作为组件&#xff08;子窗口&#xff09;。 通过构造函数可以创建以上两种形态的QWidget&#xff1a; // 参数1&#xff1a;使…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

【重学 MySQL】七十一、揭秘数据库魔法——深入探索并引入视图

【重学 MySQL】七十一、揭秘数据库魔法——深入探索并引入视图 视图的定义视图的作用视图的注意事项 在MySQL数据库中&#xff0c;视图&#xff08;View&#xff09;是一种非常强大且灵活的工具&#xff0c;它为用户提供了以更安全、更清晰的方式查看和管理数据的途径。 视图的…

《计算机视觉》—— 换脸

效果如下&#xff1a; 完整代码&#xff1a; import cv2 import dlib import numpy as npJAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36…

【深入解析】ChatGPT各版本在论文写作中的五大表现差异

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 人工智能在自然语言处理领域已取得了显著进展&#xff0c;尤其是OpenAI的ChatGPT系列在文本生成和理解方面表现突出。然而&#xff0c;不同版本的ChatGPT在论文写作中的表现存在明显差异…