Leetcode 238 Product of Array Except Self 时间O(n)和空间O(1)解法

Leetcode 238 Product of Array Except Self 时间O(n)和空间O(1)解法

大家好,又见面了,我是全栈君。

1. 问题描写叙述

  给定一个n个整数的数组(

n>1
)nums,返回一个数组output,当中的元素

outputi
的值为原数组nums中除

numsi
之外的全部元素的积。比如:nums数组为[1,2,3,4]。返回的output数组为[24,12,8,6]。

  要求不用除法和时间复杂度为O(n).
 

2. 方法与思路

  这道题假设没有除法的限制的话就非常easy了,先求全部数的乘积,然后除以

numsi
。考虑一下除数为零的情况,非常好解决。
  

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int> re;
        long mul=1;
        int zeroNum = 0;

        for(int i=0; i < nums.size(); i++)
        {
            if(nums[i] != 0) mul *= nums[i];
            else zeroNum++;
        }

        for(int i = 0; i < nums.size(); i++)
        {
            if(zeroNum > 1) re.push_back(0);
            else if(zeroNum == 1)
            {
                if(nums[i] == 0) re.push_back(mul);
                else re.push_back(0);
            }
            else 
                re.push_back(mul/nums[i]);
        }
        return re;
    }
};

  可是题目上明白要求不能用除法,那我们得另辟蹊径了。以下以数组[1,2,3,4,5]为例,看完以下表述就明白了:

扫描顺序 1 2 3 4 5
从左至右

1


1×1


1×1×2


1×1×2×3


1×1×2×3×4
从右至左

1×(2×3×4×5)


(1×1×(3×4×5)


(1×1×2)×(4×5)


(1×1×2×3)×(5)


(1×1×2×3×4)×(1)

  
  就是先从左至右扫描,记录前

i1
个数的乘积,第二遍扫描时,从右至左。将乘积再乘以后

i+1
位的乘积。
  

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

        for(i = 1; i < nums.size(); i++)
            re[i] =re[i-1] * nums[i-1];

        for(i = nums.size()-1; i >= 0; i--)
            re[i] *= tmp,tmp *= nums[i];

        return re;
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115781.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java多线程——基本概念「建议收藏」

    Java多线程——基本概念「建议收藏」线程和多线程程序:是一段静态的代码,是应用软件执行的蓝本进程:是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程线程:是比进程更小的执行单位。进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念主线程:(每个Java程序都有一个…

    2022年5月13日
    37
  • 软件测试流程五个阶段

    软件测试流程五个阶段软件测试按照研发阶段一般分为5个部分:单元测试、集成测试、确认测试、系统测试、验收测试,下面将不同阶段需要的一些工作内容做一下梳理希望可以帮助到大家。 //No.1//单元测试 单元测试又称为模块测试,是针对软件设计的最小单位程序模块进行正确性检查的测试工作,单元测试需要从程序内部结构出发设计测试用例,多个模块可以平行地独立进行单元测试。一、单元测试的内容: 1、模…

    2022年6月7日
    59
  • js数组删除某个值_数组删除指定下标元素

    js数组删除某个值_数组删除指定下标元素方法利用indexOf以及splice来删除指定的值案例vararray=[2,5,9];varindex=array.indexOf(5);array.splice(index,1);}splice两个参数、第一个开始删除的下标、第二个删除的数量

    2022年10月1日
    0
  • RocketMQ 入门使用详解[通俗易懂]

    RocketMQ 入门使用详解[通俗易懂]RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,已经于2016年11月成为 Apache 孵化项目,相信RocketMQ的未来会发挥着越来越大的作用,将有更多的开发者因此受益。 本文仅对RocketMQ的简单实用做入门性介绍,不对RocketMQ的底层原理进行深入介绍,后续文章将对RocketMQ的原理做详细介绍。

    2022年6月17日
    20
  • nvidia显卡无法弹出或拔出_英伟达控制面板显示未连接到gpu

    nvidia显卡无法弹出或拔出_英伟达控制面板显示未连接到gpu上个月在新入手的笔记本上安装了一个CUDA的开发环境,并选择安装了GeForceExperience工具,前两天打开GeForceExperience工具浏览时,工具提醒可以更新NVIDIA显卡驱动,于是便勾选并更新了NVIDIA显卡驱动,更新完成之后就没管它,也没有再使用过CUDA开发环境,直到昨天打开CUDA开发环境准备调试一个应用程序时,突然弹出错误提示框:       

    2022年8月31日
    2
  • 使用青花瓷对Android app 抓包

    使用青花瓷对Android app 抓包记录一下使用青花瓷抓包的过程(主要Android中的app)青花瓷window版本下载地址:http://www.pc6.com/softview/SoftView_426224.htmlhttps://www.charlesproxy.com/官网地址前提条件,电脑和手机存在于同一个网路下,才能实现抓包操作。1.获取代理服务器的地址(主要是给手机用):cmd中输入…

    2022年5月11日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号