前缀和(4)_除自身以外数组的乘积

news2024/11/17 23:56:30

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

前缀和(4)_除自身以外数组的乘积

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 题目链接 :

2. 题目描述 :

3. 解法(一维前缀和) :

    算法思路 :

    代码展示 :

 进阶:

    结果分析 :


1. 题目链接 :

OJ链接: 除自身以外数组的乘积

2. 题目描述 :

给你一个整数数组 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
  • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内

3. 解法(一维前缀和) :

    算法思路 :

注意题目的要求,不能使用除法,并且在O(N)的时间复杂度内完成该题.那么我们就不能使用暴力的解法,以及求出整个数组的乘积,然后除以单个元素的方法.

继续分析,根据题意,对于每一个位置的最终结果ret[i],它是由两部分组成的:

        1. nums[0] * nums[1] * ......* nums[i - 1]

        2. nums[i + 1]  * nums[1 + 2] * ...... * nums[n - 1]

于是,我们可以利用前缀和思想,使用两个数组pos和suf,分别处理出来两个信息:

        1. post表示: i位置之前的所有元素,即[0, i - 1]区间内所有元素的前缀乘积

        2. suf表示: i位置之后的所有元素,即[i + 1, n - 1]区间内所有元素的后缀乘积,然后处理最终结果

    代码展示 :

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> front_dp(n), back_dp(n);
        
        front_dp[0] = 1;
        back_dp[n - 1] = 1;

        for(int i = 1; i < n; i++)
            front_dp[i] = front_dp[i - 1] * nums[i - 1];

        for(int i = n - 2; i >= 0; i--)
            back_dp[i] = back_dp[i + 1] * nums[i + 1];

        vector<int> ret;
        for(int i = 0; i < n; i++)
            ret.push_back(front_dp[i] * back_dp[i]);

        return ret;
    }
};

 

 进阶:

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

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> ret(n, 1);

        //计算前缀和
        for(int i = 1; i < n; i++)
            ret[i] = ret[i - 1] * nums[i - 1];

        //计算后缀乘积与前缀乘积相乘
        int flag = 1;
        for(int i = n - 1; i >= 0; i--)
        {
            ret[i] *= flag;
            flag *= nums[i];
        }

        return ret;
    }
};

 

    结果分析 :

优化说明

  1. 使用一个结果数组: 直接在 ret 数组中计算前缀乘积,后续再用一个变量 suffix 计算后缀乘积并更新 ret
  2. 空间复杂度: 最终的空间复杂度变为 O(1)(输出数组不算额外空间),因为我们只使用了一个额外的变量 suffix 来存储后缀乘积。

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

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

相关文章

央国企董事会管理方案,数字化助力会议、制度、信披、投资全过程全方位管理

董事会建设是中国特色现代企业制度的重要内容。近日&#xff0c;国务院国资委召开中央企业董事会建设工作推进会&#xff1a;到明年年底&#xff0c;中央企业集团和二级子企业层面董事会建设要取得重要实质性进展&#xff0c;董事会制度更加健全、运行更加规范&#xff0c;作用…

如何进行光伏项目卫星踏勘?

一、卫星地图选址 1. 数据获取 卫星踏勘的第一步是获取高分辨率的卫星图像。利用卫星遥感技术&#xff0c;可以获取项目候选区域的地形地貌、植被覆盖等详细信息。这些数据通过专业的遥感图像处理软件进行分析和解译&#xff0c;提取出对光伏电站建设有重要影响的关键因素&am…

【Git使用】向Gitee/Github上传代码时配置gitignore忽略文件

概述&#xff1a; 在进行项目开发时&#xff0c;尤其是使用Git进行版本控制时&#xff0c;我们经常会遇到一些不需要上传到代码仓库的文件&#xff0c;比如编译生成的文件、临时文件、日志文件等。这时候&#xff0c;我们就需要使用.gitignore文件来忽略这些文件。本文将介绍如…

单点登录sso部署

文章目录 同域下的单点登录原理不同域下的单点登录原理 第三方 OAuth2 授权登录支持第三方登录 本地用keycloak实现1、生成证书2、编写docker-compose.yml文件3、创建持久化数据目录4、接下来启动docker-compose5、访问keycloak 单点登录英文全称Single Sign On&#xff0c;简称…

宠物浮毛难清理,希喂、小米、美的宠物空气净化器该选哪款?

养猫养出病来说的就是我了。 养猫之前幻想的一人一猫幸福生活还没一个月&#xff0c;我就进了医院。我自认为是很爱干净的人&#xff0c;养猫后打扫得更勤快了&#xff0c;早晚都给猫咪梳毛。平时卫生也没少搞&#xff0c;家里也是很干净的&#xff0c;实在不明白为什么会过敏…

语义分割性能提升---通过优化损失改进分割效果

本文主要总结最近的调研调试结果&#xff0c;介绍通过改进损失来提升语义分割的分割效果&#xff1b;当然还有其他途径&#xff0c;比如蒸馏&#xff08;提升分割效果&#xff09;、剪枝&#xff08;提升fps&#xff09;&#xff0c;之前博客有总结&#xff0c;此处不做介绍。 …

数字化AI直播系统领创者:赋能无人直播新动力,永久告别假AI!

数字化AI直播系统领创者&#xff1a;赋能无人直播新动力&#xff0c;永久告别假AI&#xff01; 在数字化浪潮汹涌的今天&#xff0c;AI技术正以前所未有的速度渗透并重塑着各行各业&#xff0c;而直播行业作为数字经济的重要组成部分&#xff0c;更是迎来了AI技术深度融合的崭…

C++类和对象第一关

一&#xff1a;类的定义 &#xff08;一&#xff09;类的定义 &#xff08;1&#xff09;类的定义格式&#xff1a; class name{ // 类成员变量 // 类方法&#xff08;函数&#xff09; }; class是定义类的关键字&#xff0c;name为定义的类的名字&#xff0c;后面的花括号…

【高中数学/对数函数/零点】已知函数f(x)=1/x-log(2,x),在下列区间中,包含f(x)零点的区间是?

【题目】 已知函数f(x)1/x-log(2,x),在下列区间中&#xff0c;包含f(x)零点的区间是&#xff1f; A.(0,1) B.(2,3) C.(3,∞) D.(1,2) 【出处】 《高考数学极致解题大招》P136 第二题 中原教研工作室编著 【解答】 零点即01/x-log(2,x),移项得1/xlog(2,x) 两曲线y1/x…

【C++习题】2.双指针_移动零

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法&#xff08;快排的思想&#xff1a;数组划分区间 - 数组分两块&#xff09;&#xff1a;C 算法代码&#xff1a;图解 题目链接&#xff1a; 283.移动零 题目描述&#xff1a; 解法&#xff08;快排的思想&#xff1a;数…

聚铭下一代智慧安全运营中心荣获CNNVD兼容性资质证书

近日&#xff0c;聚铭网络旗下安全产品——聚铭下一代智慧安全运营中心正式通过了国家信息安全漏洞库&#xff08;CNNVD&#xff09;兼容性认证测试&#xff0c;荣获国家信息安全漏洞库兼容性资质证书。 关于CNNVD兼容性 国家信息安全漏洞库&#xff08;CNNVD&#xff09;是…

Iceberg 基本操作和快速入门

安装 Iceberg 是一种适用于大型分析表的高性能工具&#xff0c;通过spark启动并运行iceberg&#xff0c;文章是通过docker来进行安装并测试的 新建一个docker-compose.yml文件 文件内容 version: "3" services: spark-iceberg: image: tabulario/spark-iceberg co…

干部画像如何精准科学识别优秀干部

干部画像作为一种精准、科学的评价工具&#xff0c;在识别优秀干部方面发挥着关键作用。通过全面、深入、系统地收集、整理和分析干部的多维度信息&#xff0c;形成一幅反映干部综合素质和能力的立体画卷&#xff0c;为组织部门提供了详实可靠的依据。以下是干部画像在精准、科…

Colorful/七彩虹将星X15 AT22 2022 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

Exception in thread “main“ java.lang.CloneNotSupportedException 解决方案

目录 前言&#xff1a; 解决方案 后言&#xff1a; 结言&#xff1a; 前言&#xff1a; 今天在学习设计模式的时候&#xff0c;犯的一个错误。很低级的错误&#xff0c;不过也记录一下&#xff08;绝对不是想水文章&#xff09;。 解决方案 在使用克隆方法时抛出这个异…

2024年第五届电力工程国际会议(ICPE 2024)将在上海召开!

为了总结交流我国电力研究技术的最新研究成果&#xff0c;促进国内外电力技术发展与交流&#xff0c;开拓电力技术应用领域&#xff0c;将于2024年12月13-15日在 中国上海举办第五届电力工程国际会议 (ICPE 2024) 。 本次会议由IEEE、PES、上海电力大学主办&#xff0c;电子科技…

猜想的反例:DFS中结点顺序与后代关系的分析

猜想的反例:DFS中结点顺序与后代关系的分析 猜想分析与反例构造反例描述伪代码与C代码实现反例验证在图论中,深度优先搜索(DFS)是一种重要的图遍历算法,它可以生成一棵深度优先森林(DFS Forest),揭示结点之间的祖先-后代关系。本文探讨一个特定猜想:如果有向图G包含一…

Linux服务器安装Anaconda环境

Linux浪潮云服务器安装Anaconda环境 读研之后在导师的帮助下&#xff0c;获得了浪潮的一台公共云服务器。以后做实验跑代码就可以使用云服务器上的虚拟环境了。减少了自己笔记本的压力。在创建并保存完成镜像环境之后。最重要的就是安装好深度学习需要的Anaconda环境&#xff0…

vue-i18n在使用$t时提示类型错误

1. 问题描述 Vue3项目中&#xff0c;使用vue-i18n&#xff0c;在模版中使用$t时&#xff0c;页面可以正常渲染&#xff0c;但是类型报错。 相关依赖版本如下&#xff1a; "dependencies": {"vue": "^3.4.29","vue-i18n": "^9.1…

MES管理系统的工单管理功能模块有什么用

在当今制造业的快速发展中&#xff0c;企业对于生产流程的高效管理与优化需求日益迫切。MES管理系统作为集成了生产计划、物料追踪、工艺执行、设备监控以及质量管理等核心功能的综合性软件平台&#xff0c;正逐步成为企业转型升级的关键驱动力。MES管理系统不仅通过实时数据洞…