数据结构学习 jz66 构建乘积数组

关键词:数学 双指针

方法一:这个题目我一开始做不知道不能用除法。我做的:[ 用时: 12 m 12 s ] 用了除法 分类讨论

方法二:后来看了提示,双指针,两边各开始乘。

方法三:然后又看了答案可以节省空间。

题目:按规则计算统计结果

方法一:

用了除法 分类讨论

思路:

统计是否有零,不然没法除。

count_0//如果有0,那么true

求所有数的乘积:

res记录所有数(除了第一个遇到的0)的乘积结果。

如果只有一个0,那么除了它以外的数的乘积就是res。

如果有超过一个0,那么全部结果都是0。

        for(const auto&x:arrayA)
        {
            if(x==0&&count_0==0)
            {
                 count_0++;
                 continue;
            }
            res*=x;
        }

求结果:

如果没有0,那么正常除。

如果有0,则0那个位置的结果就是res,除了0以外的数的结果都是0。

        for(const auto&x:arrayA)
        {
            if(count_0==0)
                arrayB.push_back(res/x);
            else
            {
                if(x==0)
                    arrayB.push_back(res);
                else
                    arrayB.push_back(0);  
            }
        }

复杂度计算:

时间复杂度O(n)

空间复杂度O(1)

代码:

class Solution {
public:
    vector<int> statisticalResult(vector<int>& arrayA) {
        int res=1;
        int count_0=0;
        for(const auto&x:arrayA)
        {
            if(x==0&&count_0==0)
            {
                 count_0++;
                 continue;
            }
            res*=x;
        }
        vector<int> arrayB;
        for(const auto&x:arrayA)
        {
            if(count_0==0)
                arrayB.push_back(res/x);
            else
            {
                if(x==0)
                    arrayB.push_back(res);
                else
                    arrayB.push_back(0);  
            }
        }
        return arrayB;
    }
};

方法二:

看了答案的提示:左右两边各开始乘,得到从左到右和从右到左的两个向量

思路:

用两个向量记录从左到右累积和从右到左累积的结果。

然后求res的时候,左右各乘结果。

arrayA

2

3

4

5

6

l2r

2

2*3

2*3*4

2*3*4*5

2*3*4*5*6

r2l

6

6*5

6*5*4

6*5*4*3

6*5*4*3*2

res

R2l[3]

l2r[0]*r2l[2]

l2r[1]*r2l[1]

l2r[2]*r2l[0]

l2r[3]

复杂度计算:

时间复杂度O(n)

空间复杂度O(n) 2n,两个向量存累积结果

 代码:

class Solution {
public:
    vector<int> statisticalResult(vector<int>& arrayA) {
        vector<int> res;
        if(arrayA.empty()) return res;
        if(arrayA.size()==1) return arrayA;
        vector<int> l2r,r2l;
        l2r.push_back(arrayA[0]);//初始化
        r2l.push_back(arrayA[arrayA.size()-1]);//初始化
        for(int i=1;i<arrayA.size();++i)//左到右累积
        {
            l2r.push_back(l2r[i-1]*arrayA[i]);
        }
        for(int i=1;i<arrayA.size();++i)//右到左累积
        {
            r2l.push_back(r2l[i-1]*arrayA[arrayA.size()-i-1]);
        }
        for(int i=0;i<arrayA.size();++i)//求res
        {
            int temp=1;
            if(i>0) temp*=l2r[i-1];//如果i=0,就不用左边
            if(i<arrayA.size()-1) temp*=r2l[arrayA.size()-i-2];//如果i在最右边,就不用右边
            res.push_back(temp);
        }
        return res;
    }
};

方法三:

看了k神的答案写的 和方法二一样但节省了空间

思路:

具体看k神的图解。

主要是先乘下三角,再乘上三角,即可。

下三角:

上三角:

复杂度计算:

时间复杂度O(n)

空间复杂度O(1) 

代码:

class Solution {
public:
    vector<int> statisticalResult(vector<int>& arrayA) {
        vector<int> res;
        if(arrayA.empty()) return res;
        if(arrayA.size()==1) return arrayA;
        res.push_back(1);
        for(int i=1;i<arrayA.size();++i)//下三角
        {
            res.push_back(res[i-1]*arrayA[i-1]);
        }
        int temp=1;
        for(int i=arrayA.size()-2;i>=0;--i)//上三角
        {
            temp*=arrayA[i+1];
            res[i]*=temp;
        }

        return res;
    }
};

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

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

相关文章

几款提高开发效率的Idea 插件

1、ignore 开发代码过程中经常会有一些需要提交到代码仓库的文件&#xff0c;比如java文件生成的.class、.jar 等&#xff0c;如果将编译后的文件都提交到代码库那么代码库会很大&#xff0c;关键是没有必要。 这款插件就可以很方便的解决某类文件或者某个文件夹不需要提交到…

OS进程管理

进程 文章目录 进程概念组成特征状态与转换组织方式链接方式索引方式 进程控制实现进程控制如何实现原语的“原子性” 进程通信(IPC)共享存储基于存储区共享基于数据结构的共享 消息传递直接通信方式间接通信方式 管道通信 线程实现方式用户级线程内核级线程 多线程模式状态与转…

文件销毁的方法与安全操作守则, 淼一护航文件安全最后一公里

文件销毁的目前大概分为三种&#xff0c;分别是&#xff1a; 一、做成纸浆填埋。把需要销毁处理的过期涉密文件放到工业浸泡池里面浸泡&#xff0c;放入自来水和一定比例的化学药物&#xff0c;文件经过5-8个小时的浸泡后变成了纸浆&#xff0c;上面记录的信息也随之被销毁。最…

智慧公厕:城市公共厕所环境卫生管理的智慧引擎

公共厕所是城市重要的环卫基础设施&#xff0c;也是城市建设不可或缺的组成部分。其整洁度、方便性和管理精细化&#xff0c;直接体现了城市管理水平和文明程度。为了满足越来越高的城市管理要求&#xff0c;智慧公厕应运而生。借助物联网技术、传感感知技术、云计算和大数据等…

2023年全球软件开发大会(QCon北京站2023)9月:核心内容与学习收获(附大会核心PPT下载)

随着科技的飞速发展&#xff0c;全球软件开发大会&#xff08;QCon&#xff09;作为行业领先的技术盛会&#xff0c;为世界各地的专业人士提供了交流与学习的平台。本次大会汇集了全球的软件开发者、架构师、项目经理等&#xff0c;共同探讨软件开发的最新趋势、技术与实践。本…

图书管理系统:从数据库设计到前端展示的实战经验分享

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

汽车线束的汽配企业MES管理系统解决方案

随着科技的飞速发展和环保需求的日益提升&#xff0c;新能源汽车在全球范围内崭露头角&#xff0c;成为未来出行的主导力量。在这股浪潮中&#xff0c;中国凭借其强大的研发实力和市场敏锐度&#xff0c;迅速崛起为新能源汽车领域的佼佼者。而作为汽车数字化控制与智能化应用的…

[LitCTF 2023] Web类题目分享

[LitCTF 2023] Web类题目做法及思路解析&#xff08;个人分享&#xff09; 题目平台地址&#xff1a;NSSCTF | 在线CTF平台 一、[LitCTF 2023]我Flag呢&#xff1f; 奇怪&#xff0c;放哪里了&#xff0c;怎么看不见呢&#xff1f;&#xff08;初级难度&#xff09; 1.访问…

软件测试|Python中如何提取列表中索引为奇数的元素

简介 在Python中&#xff0c;我们经常需要从列表中提取特定位置的元素。如果我们想要提取列表中索引为奇数的元素&#xff0c;可以使用一些简单的方法来实现这一目标。本文将介绍如何在Python中提取列表中索引为奇数的元素&#xff0c;并提供示例代码来帮助大家更好地理解这个…

写点东西《使用 Docker 构建本地开发环境:运行带有 PostgreSQL 和 Minio S3 的 Next.js 全栈应用程序》

写点东西《使用 Docker 构建本地开发环境&#xff1a;运行带有 PostgreSQL 和 Minio S3 的 Next.js 全栈应用程序》 [TOC](写点东西《使用 Docker 构建本地开发环境&#xff1a;运行带有 PostgreSQL 和 Minio S3 的 Next.js 全栈应用程序》) [](#introduction) 简介 先决条件 构…

HCIP-3

重发布、重分布、重分发&#xff1a; ASBR同时工作于不同的路由协议中&#xff0c;然后通过各种的方式学习的条目&#xff0c;再进行共享&#xff1b; 必须存在ASBR----自治系统边界路由器--协议边界路由器需要考虑种子度量 规则&#xff1a; 将A协议发布到B协议&#xff0c…

SpringBoot教程(九) | SpringBoot统一异常处理

SpringBoot教程(九) | SpringBoot统一异常处理 异常大家应该都很清楚&#xff0c;我们的项目总是不可避免的出现异常&#xff0c;那么应该如何优雅的进行异常处理使我们需要关注的一个问题&#xff0c;合理的异常封装既可以方便前端的处理&#xff0c;也能够简化后端的开发。 …

uniap vue3 组件使用uni.createSelectorQuery() 获取dom报错

由于vue3中没有this&#xff0c;所以使用uni.createSelectorQuery().in(this)时&#xff0c;会报错 使用 getCurrentInstance 获取组件实例 使用 uni.createSelectorQuery() 批量查询时&#xff0c;结果是按照查询的顺序返回的 使用示例 import { getCurrentInstance } from…

MySQl导入与导出远程备份

文章目录 一. navicat导入导出 二. mysqldump命令导入导出导入导出 三. load data infile命令导入导出导入导出 四. 远程备份导入导出思维导图 一. navicat 导入 右键——>运行SQL文件 导出 选中要导出的表➡右键➡转储SQL文件➡数据和结构 二. mysqldump命令导入导出…

uniapp 打包成 apk(原生APP-云打包)免费

修改APP配置 根据需求&#xff0c;修改 manifest.json 配置&#xff0c;常见的修改有&#xff1a; 应用名称&#xff0c;应用版本名称&#xff0c;应用版本号 升级版本时&#xff0c;应用版本名称和应用版本号必须高于上一版的值 应用图标 点浏览选择png格式的图片后&#x…

HTML--CSS--超链接样式以及鼠标样式自定义

超链接伪类 再复习一下,超链接的定义方式如下&#xff1a; <!DOCTYPE html> <html> <head> <title>这是一个标题</title><meta charset"utf-8"/><style></style> </head> <body><a href"http…

操作系统概述

概述 文章目录 概述定义功能特征并发共享并发与共享的关系虚拟异步 发展与分类手工操作阶段批处理阶段分时操作系统实时操作系统网络操作系统分布式操作系统个人计算机操作系统 运行机制程序是如何运行的&#xff1f;内核程序应用程序特权指令非特权指令内核态用户态内核态与用…

人力资源智能化管理项目(day01:基础架构拆解)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 一、基础架构拆解 1.拉取模板代码 git clone GitHub - PanJiaChen/vue-admin-template: a vue2.0 minimal admin template 项目名 2.core-js…

Swift 周报 第四十五期

文章目录 前言新闻和社区苹果或将扩充健康版图&#xff0c;为Apple Watch X铺路更新后的《Apple Developer Program 许可协议》现已发布 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第四十五期&#xff0c;每个模块已初步成型。各位…

概率论与数理统计————古典概型、几何概型和条件概率

一、古典概型 特点 &#xff08;1&#xff09;有限性&#xff1a;试验S的样本空间的有限集合 &#xff08;2&#xff09; 等可能性&#xff1a;每个样本点发生的概率是相等的 公式&#xff1a;P&#xff08;A&#xff09; A为随机事件的样本点数&#xff1b;S是样本…