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

news2024/11/16 19:27:11

关键词:数学 双指针

方法一:这个题目我一开始做不知道不能用除法。我做的:[ 用时: 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;
    }
};

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

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

相关文章

特征工程-特征处理(二)

特征处理 二、时间特征处理 将原本的具体时间拆分为年月日等多个特征变量&#xff0c;同时可以引入在一天的某个时间段&#xff0c;或者是当天是否为节假日等其他条件&#xff0c;还可以进一步结合其他特征&#xff0c;进行前后一个时间段或是多个时间段时间的特征差值。 dt.…

常见的反爬虫风控 | 验证码风控

一.前言 在当今信息技术迅速发展的背景下&#xff0c;网站和在线服务面临着日益增长的自动化访问威胁&#xff0c;这些大多来自于各类爬虫程序。这种大量的自动化访问不仅对网站的正常运行构成压力&#xff0c;还可能导致敏感数据的泄露&#xff0c;甚至被用于不正当竞争和恶意…

【华为OD机试真题2023CD卷 JAVAJS】查找一个有向网络的头节点和尾节点

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 查找一个有向网络的头节点和尾节点 知识点图DFS搜索 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 给定一个有向图,图中可能包含有环,图使用二维矩阵表示,每一行的第一列表示起始节点,第二列表示终止节…

ubuntu22: nvtop no gpu to monitor.

解决方法&#xff1a; 重新下载nvtop sudo apt update sudo apt -y install nvtop真是逆天 &#xff0c;ubuntu系统的nvidia driver突然坏了&#xff0c;然后我重装了nvidia driver, 之后用nvtop就出现这个问题了&#xff0c;但是逆天的是我竟然没有搜到一篇中文的帖子讲这个问…

自己动手写一个 Arthas 在线诊断工具系列说明

相关文章&#xff1a; 自己动手写一个分库分表中间件&#xff08;十&#xff09;线上优化之数据库连接超时优化自己动手写分布式任务调度框架自己动手写 Java 虚拟机&#xff08;二&#xff09;-查找 Class 文件自己动手调试 JDK&#xff08;CLion&#xff09;Java Agent 的简…

Linux网络文件共享服务之FTP协议

目录 一、存储类型 1、直连式存储&#xff08;DAS&#xff09; 2、存储区域网络&#xff08;SAN&#xff09; 3、网络附加存储&#xff08;NAS&#xff09; 二、 FTP文件传输协议 1、FTP协议的工作原理 1.1 FTP协议的工作流程 1.2 FTP协议的两种工作模式 1.2.1 主动模…

6314A/B/C 稳定光源

01 6314A/B/C 稳定光源 产品综述&#xff1a; 6314系列稳定光源包括6314A稳定光源(1310NM单波长)、6314B稳定光源(1550NM单波长)、6314C稳定光源(1310NM &1550NM双波长)。6314系列稳定光源采用高精度自动功率控制技术和自动温度控制技术。6314系列稳定光源配备多种模块&…

Mysql中设置只允许指定ip能连接访问(可视化工具的方式)

场景 Mysql中怎样设置指定ip远程访问连接&#xff1a; Mysql中怎样设置指定ip远程访问连接_navicat for mysql 设置只有某个ip可以远程链接-CSDN博客 前面设置root账户指定ip能连接访问是通过命令行的方式&#xff0c;如果通过可视化工具比如Navicat来实现。 注&#xff1a…

二叉树题目:从前序与后序遍历序列构造二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;从前序与后序遍历序列构造二叉树 出处&#xff1a;889. 从前序与后序遍历序列构造二叉树 难度 7 级 题目描述…

7_1 tesseract 安装及使用

1、 安装tesseract   OCR&#xff0c;即Optical Character Recognition&#xff0c;光学字符识别&#xff0c;是指通过扫描字符&#xff0c;然后通过其形状将其翻译成电子文本的过程。对于图形验证码来说&#xff0c;它们都是一些不规则的字符&#xff0c;这些字符确实是由字…

运筹说 第99期 | 非线性规划—最优性条件

通过上期学习&#xff0c;大家已经了解了非线性规划中无约束极值问题及其求解方法。本期小编将为大家介绍最优性条件&#xff0c;包括可行下降方向、库恩-塔克条件等内容。 1 可行下降方向 起约束作用 假定X(0)是上述问题的一个可行解&#xff0c;满足所有约束。对某约束条件g…

2024年,如何打造惊艳的个人博客/出版系统并且赚点小钱?

几年前&#xff0c;我就推荐过用Markdown写作静态博客。静态博客几乎是零托管成本&#xff0c;比较适合个人博客起步。Markdown便于本地搜索&#xff0c;也可当作是个人知识库方案。 现在有了新的进展。我不仅构建了一个视觉上相当不错的个人网站&#xff0c;还美化了github、…

Linux/Frolic

Enumeration nmap 还是扫描系统对外开放的端口情况&#xff0c;对外开放了22,139,445,还有9999端口&#xff0c;显示是http服务&#xff0c;使用了nginx 1.10.3 ┌──(kali㉿kali)-[~/HTB/Frolic] └─$ nmap -sC -sV -oA nmap -Pn 10.10.10.111 Starting Nmap 7.93 ( http…

pandas进行数据计算时如何处理空值的问题?

目录 1.数据预览&#xff1a; 2.解决方法 &#xff08;1&#xff09;问题示例 &#xff08;2&#xff09;方法 A.方法一 B.方法二 1.数据预览&#xff1a; 2.解决方法 &#xff08;1&#xff09;问题示例 如下图如果不理睬这些空值的话&#xff0c;计算总分便也会是空值…

uni-app购物车页面详细代码

效果图&#xff1a; 这里的购物车加减用的是uni-app中的sku插件 代码附下&#xff08;全&#xff09;&#xff1a; <script setup lang"ts"> import {reqMemberCartList,reqMemberdelentCart,reqMemberPutCart,putMemberCartSelectedAPI, } from /services/…

linux后台进程的总结

文章目录 方案1 nohup &方案2 screen 方案1 nohup & 1、单独使用 nohup 执行脚本&#xff0c;如下图所示&#xff0c;终端会被接管&#xff0c;就是标准输入stdin 被关闭了&#xff0c;使用ctrlc会导致终止执行&#xff0c;但是可以关闭这个终端&#xff0c;重新打开终…

c5060:out can‘t be used with used with non-varying visibility

openGL系列文章目录 文章目录 openGL系列文章目录前言一、GLSL language integration是什么&#xff1f;二、GLSL language integration配置二、GLSL language integration编译报错解决 前言 GLSL插件下载和安装&#xff1a;GLSL language integration下载地址 你也可以在visu…

【python可视化大屏】使用python实现可拖拽数据可视化大屏

介绍&#xff1a; 我在前几期分享了关于爬取weibo评论的爬虫&#xff0c;同时也分享了如何去进行数据可视化的操作。但是之前的可视化都是单独的&#xff0c;没有办法在一个界面上展示的。这样一来呢&#xff0c;大家在看的时候其实是很不方便的&#xff0c;就是没有办法一目了…

软件测试|教你使用dataclass

前言 当我们需要在Python中定义一种简单的数据容器类时&#xff0c;dataclass是一个非常有用的工具。它允许我们轻松地创建具有一些自动化特性的类&#xff0c;例如自动生成__init__()、__repr__()和__eq__()等方法。本文将详细介绍dataclass的使用&#xff0c;并提供示例来说…

Qt点击按钮在其附近弹出一个窗口

效果 FS_PopupWidget.h #ifndef FS_POPUPWIDGET_H #define FS_POPUPWIDGET_H#pragma once#include <QToolButton> #include <QWidgetAction> #include <QPointer>class QMenu;class FS_PopupWidget : public QToolButton {Q_OBJECTpublic:FS_PopupWidget(QW…