【算法】前缀和——除自身以外数组的乘积

本节博客是用前缀和算法求解“除自身以外数组的乘积”,有需要借鉴即可。

目录

  • 1.题目
  • 2.前缀和算法
  • 3.变量求解
  • 4.总结

1.题目

题目链接:LINK
在这里插入图片描述

2.前缀和算法

  • 1.创建两个数组
    • 第一个数组第i位置表示原数组[0,i-1]之积
    • 第二个数组第i位置表示原数组[i+1,n-1]之积
  • 2.进行求解结果

图解如下:
在这里插入图片描述
在这里插入图片描述

参考代码如下:

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) 
    {
        //预处理前缀和数组
        int n = nums.size();
        vector<long long> f(n);
        vector<long long> g(n);

        f[0] = 1;
        g[n-1] = 1;
        for(size_t i = 1; i < n; i++)
        {
            f[i] = f[i-1] * nums[i-1];
        }
        for(int i = n - 2; i >= 0; i--)
        {
            g[i] =g[i+1] * nums[i+1];
        }

        //求结果
        vector<int> ret(n);
        for(size_t i = 0; i < n; i++)
        {
            ret[i] = f[i] * g[i];
        }

        return ret;
    }
};

3.变量求解

下面我们来挑战一下这道题的进阶版本:要求我们空间复杂度O(1)
在这里插入图片描述
显然,前缀和算法时间复杂度是O(N),不满足题目要求,因而我们应该用变量求解。

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) 
    {
        //要求空间复杂度:O(1)
        int n = nums.size();
        int f = 1;//充当前缀积变量
        int g = 1;//充当后缀积变量

        vector<int> ret(n,1);

        for(int i = 0; i<n; i++)
        {
            ret[i]*= f;
            f *= nums[i];
        }
        for(int i = n - 1; i >= 0 ;i--)
        {
            ret[i]*= g;
            g*=nums[i];
        }

        return ret;
    }
};

当然,两次循环也可以合并一下,就成下面这个代码了:

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) 
    {
        //要求空间复杂度:O(1)
        int n = nums.size();
        int f = 1;//充当前缀积变量
        int g = 1;//充当后缀积变量

        vector<int> ret(n,1);

        for(int i = 0; i<n; i++)
        {
            ret[i]*= f;
            ret[n-1-i]*= g;
            
            f *= nums[i];
            g *= nums[n-1-i];
        }
       
        return ret;
    }
};

注:两个代码在效率上并没有提升。后者比前者虽然看着少了一次循环,但是我感觉效率是一样的,该怎么算还是怎么算,只不过是两种不同的写法而已!

4.总结

这个题目是一个简单运用前缀和的简单题目。

进阶方面来看:这个题用前缀和多开空间虽然可以,不过有点多余,因为我们记住那么多数没用,下一次要用的数是确定的,所以不用记那么多,记住下一次要用的数字就行。


EOF

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

How to limit request by IP on nginx?

/etc/nginx/conf.d/default.conf 1.Define a limit_req_zone # 定義限流區塊 limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; 是一个 Nginx 配置指令&#xff0c;用于定义请求限制区域和…

【linux】多线程(2)

文章目录 线程的应用生产消费者模型自制锁生产消费队列成员参数生产函数消费函数 任务处理方式主函数 POSIX信号量sem_wait()sem_post() 线程池应用场景示例 单例模式饿汉实现单例 吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.懒汉实现单例…

GMSL2硬件设计V1.1

一、说明 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司(现属于ADI)推出的一种高速串行接口,通过同轴电缆或屏蔽双绞线(STP)传输高速串行数据,用于汽车摄像头和显示器应用。GMSL2就是指ADI专有的第二代千兆多媒体串行链路技术,传输…

重生之while在鸣潮学习HTML

个人主页&#xff1a;终端 今天是开荒的第五天&#xff0c;数据坞都刷了吗&#xff0c;没刷就过来学html&#xff01; 目录 JavaWeb学习路线 1.HTML入门 1.1什么是HTML 1.2HTML&CSS&JavaScript的作用 1.3什么是超文本 1.4什么是标记语言 1.5HTML基础结构 1.6HTML的…

通过acme.sh和cloudflare实现免费ssl证书自动签发

参考使用acme.sh通过cloudflare自动签发免费ssl证书 | LogDicthttps://www.logdict.com/archives/acme.shshi-yong-cloudflarezi-dong-qian-fa-mian-fei-sslzheng-shu

Jmeter-使用手册(_5.5版本)

JMeter是一个Java桌面应用程序&#xff0c;具有使用Swing图形API的图形界面。可以进行接口、性能等测试&#xff0c;也可以对任何数据库进行同样的测试&#xff0c;具有可移植性&#xff0c;可跨平台支持Windows&#xff0c;Linux&#xff0c;Mac上使用。 JMeter运行场景不仅可…

【openlayers系统学习】4.2Mapbox 样式渲染图层

二、Mapbox 样式渲染图层 显然我们目前的地图需要一些样式。 VectorTile​ 图层的样式与 Vector​ 图层的样式工作方式完全相同。那里描述的样式在这里也适用。 对于这样的地图&#xff0c;创建数据驱动的样式&#xff08;对矢量图层操作&#xff09;非常简单。但矢量切片也用…

AIGC 003-Controlnet升级你的SD让图像生成更加可控!

AIGC 003-Controlnet升级你的SD让图像生成更加可控&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 ControlNet 论文 (Adding Conditional Control to Text-to-Image Diffusion Models) 提出了一种名为 ControlNet 的神经网络结构&#xff0c;旨在为大型文本到图…

趣店集团golang一面要个20K,Channel什么情况下会出现死锁,有遇到过吗?

结束后面试官加了VX&#xff0c;并询问方便二面的时间&#xff0c;一直还没回复&#xff0c;拖着拖着给忘啦... 面试题 1、自我介绍 2、你在团队里头负责哪一块&#xff0c;这个物流开放平台流量多大 3、为什么今年3月份被从物流开放团队转到了finance财务部门&#xff0c;感…

[SWPUCTF 2021 新生赛]pop

常见的魔术方法 魔术方法__construct() 类的构造函数&#xff0c;在对象实例化时调用 __destruct() 类的析构函数&#xff0c;在对象被销毁时被调用 __call() 在对象中调用一个不可访问的对象时被调用&#xff0c;比如一个对象被调用时&#xff0c;里面没有程序想调用的属性 …

​​​【收录 Hello 算法】10.4 哈希优化策略

目录 10.4 哈希优化策略 10.4.1 线性查找&#xff1a;以时间换空间 10.4.2 哈希查找&#xff1a;以空间换时间 10.4 哈希优化策略 在算法题中&#xff0c;我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给…

云上聚智共创未来 | 移动云的项目实战,10分钟让你获得高度可玩的个人博客网站

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 随着互联网的发展各种以前看起来离我们比较遥远的词越来越近了&#xff0c;比如 云服务、大数据、区块链、容器这些听起来…

04_前端三大件JS

文章目录 JavaScript1.JS的组成部分2.JS引入2.1 直接在head中通过一对script标签定义脚本代码2.2创建JS函数池文件&#xff0c;所有html文件共享调用 3.JS的数据类型和运算符4.分支结构5.循环结构6.JS函数的声明7.JS中自定义对象8.JS_JSON在客户端使用8.1JSON串格式8.2JSON在前…

#12松桑前端后花园周刊-SolidStart、Vercel融资、Angular18、Nextjs15RC、p5.js、ChromeDevTools引入AI

⚡️行业动态 SolidStart 1.0 元框架发布 Solidjs 核心团队发布其元框架 SolidStart 1.0 正式版&#xff0c;其特点如下&#xff1a;基于文件系统的路由&#xff1b;支持SSR、流式SSR、CSR、SSG渲染模式&#xff1b;通过代码分割、树摇和无用代码删除构建优化&#xff1b;基于…

LabVIEW超快激光微纳制造系统设计

LabVIEW超快激光微纳制造系统设计 在当前的制造行业中&#xff0c;精密加工技术的需求日益增长&#xff0c;尤其是在微纳尺度上。超快激光制造技术&#xff0c;以其独特的加工精度和加工效率&#xff0c;成为了精密加工领域的重要手段。然而&#xff0c;大多数超快激光制造系统…

05.爬虫---urllib与requests请求实战(GET)

05.urllib与Requests请求实战GET 1.Urllib模块2.Requests模块3.对比4.实战 1.Urllib模块 Urllib官方文档 https://docs.python.org/3/library/urllib.request.html urllib是Python的标准库&#xff0c;用于发送HTTP请求和处理响应。它提供了urlopen、Request等函数和类来与网络…

C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现

string&#xff08;上&#xff09;&#xff1a;C初阶学习第六弹——探索STL奥秘&#xff08;一&#xff09;——标准库中的string类-CSDN博客 string&#xff08;下&#xff09;&#xff1a;C初阶学习第七弹——探索STL奥秘&#xff08;二&#xff09;——string的模拟实现-CS…

GVM: Golang多版本管理利器

本文介绍了 Go Version Manager 的功能和使用方法&#xff0c;介绍了如何通过 GVM 在系统上安装和管理多个 Go 语言版本。原文: GVM: Go Version Manager, for Golang manage multiple versions Go 版本管理器&#xff08;GVM&#xff0c;Go Version Manager&#xff09;是一款…

X-CSV-Reader:一个使用Rust实现CSV命令行读取器

&#x1f388;效果演示 ⚡️快速上手 依赖导入&#xff1a; cargo add csv读取实现&#xff1a; use std::error::Error; use std::fs::File; use std::path::Path;fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {le…

让大模型变得更聪明:人工智能的未来发展之路

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…