力扣刷题日记——L238.除自身以外数组的乘积

1. 前言

今天是力扣刷题的第三天啊,必须上点难度,不然太简单都容易刷腻了。题型依旧是数组类型,经过这几道数组类型的洗礼渐渐摸出点门道来了,给大家分享一下心得体会,下面就进入正题。

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. 题目分析

简单说一下题目的意思,就是给你一个数组 nums,你返回一个数组 answer,answer 数组中的元素对应 nums 中的元素,answer 的值等于 nums 中所有元素乘积的总和除去当前数。当然,题目规定不能用出发,也不能用出发,因为元素中有 0。

那么此时我们就会想,怎么不用除法把这个结果拿到呢?既然不能除,只能老老实实地去一个一个乘了。但是如果每次都把其他地数乘一次,那么时间复杂度就是 O(n^2) 了,显然不符合要求,那么怎么办呢?

其实绝大部分对于时间复杂度地优化都是基于去除重复步骤这个思路,这道题就是如何去除重复地步骤,你想啊,如果一共有 【1,2,3,4,5】5个数,那么计算 1 的时候,answer[0]=2345。计算 2 的时候 answer[1] = 1345,以此类推其中 45 重复计算了 3次,345 重复计算了 2 次。如果我们每次不去计算,45 就是 20 可以吗?

当然可以,我们用另一个数组把它们的结果记录下来 ,定义一个数组 right 记录从右往左的乘积结果,right[i] = nums[i]nums[i+1]…*nums[nums.length-1]。有了这个数组,我们就能直接拿到结果了,比如算 answer[0]=right[1],answer[1]=right[2]*1…等等,这样我们就优化了右边的乘积。

同理我们按照上面的思路,把从作往右的数组记为 right,这样,我们就可以说 answer[i] =left[i-1]*right[i+1],

下面就是实现的代码:

class Solution {public int[] productExceptSelf(int[] nums) {//最后一位是前面所有的数的乘积//倒数第二位是前面所有的乘积*最后一位//倒数第三位是前面所有的乘积*最后一位*倒数第二位//第一位是后面所有的乘积//当前位置的乘积,等于左右两边乘积相乘,所以只需要记录两次就行了,天才!int len = nums.length;if(len<=1){return nums;}int[] left = new int[len];int[] right = new int[len];left[0]=nums[0];right[len-1]=nums[len-1];for(int i=1;i<len;i++){left[i]=left[i-1]*nums[i];}for(int i=len-2;i>=0;i--){right[i]=right[i+1]*nums[i];}int[] answer = new int[len];answer[0] = right[1];answer[len-1]=left[len-2];for(int i=1;i<len-1;i++){answer[i]=left[i-1]*right[i+1];}return answer;}
}

注释里面是我写题的时候思考的过程,哈哈哈。一点一点分析,然后有了一点灵感,就迎刃而解了。这里代码没有润色过,比较粗糙,思路和上面说的一样就是在边界值的时候做了处理,比如最左边和最右边其实就直接等于 right[1] 和 left[len-1] 。为了防止数组越界,把长度小于 2 的直接返回。然后就是正常处理了,时间复杂度是 O(3n),但是由于3是常数,所以不会计入时间复杂度中依旧是 O(n),满足条件。

对于数组这类算法题,最常用到的思想就是累计,不管是乘还是加,把它们遍历的结果记录下来,几乎一大半都是这种题,或者类似的变体,比如这道题,分别从左往右,从右往左遍历了两次,记录了了两次结果。但是基本思想是相同的,所以遇到这种题,大家可以多往这方面去匹配,类似于中学时期匹配完全平方公式一样,哈哈哈。

4. 最后结果

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APP2:android studio如何使用lombok

一、前言 不知道从哪个版本开始&#xff0c;android studio便无法在plugins中下载lombok了&#xff0c;有人说是内置了&#xff0c;好像有这么回事儿。我主要面临如下两个问题&#xff1a; 使用内置lombok&#xff0c;可以自动生成setter、setter、toString等。但是&#xff0…

【项目笔记】java微服务:黑马头条(day02)

文章目录 app端文章查看&#xff0c;静态化freemarker,分布式文件系统minIO1)文章列表加载1.1)需求分析1.2)表结构分析1.3)导入文章数据库1.3.1)导入数据库1.3.2)导入对应的实体类 1.4)实现思路1.5)接口定义1.6)功能实现1.6.1)&#xff1a;导入heima-leadnews-article微服务&am…

思科网络中如何进行动态NAT配置

一、什么是动态NAT&#xff1f;动态NAT与静态NAT的区别是什么&#xff1f; &#xff08;1&#xff09;动态NAT&#xff08;Network Address Translation&#xff09;是一种网络地址转换技术&#xff0c;它会动态地将内部私有网络中的局域网IP地址映射为公共IP地址&#xff0c;…

ISIS单区域实验简述

ISIS 中间系统到中间系统&#xff0c;也是链路状态协议&#xff0c;工作在数据链路层&#xff0c;不依赖IP地址&#xff1b;与OSPF一样采用最短路径SPF算法&#xff0c;收敛速度快。 实验基础配置&#xff1a; r1: sys sysname r1 undo info enable int g0/0/0 ip add 12.1.1.1…

优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Vuevue.js库的基本使用vue.js的M-V-VM思…

OpenCASCADE开发指南<五>:OCC 内存管理器和异常类

一个软件首先要规定能处理的数据类型&#xff0c; 其次要实现三项最基本的功能——引用管理、内存管理和异常管理。在 OCC 中&#xff0c;这三项功能分别对应基础类中的句柄、内存管理器和异常类。 1 异常类 1. 1 异常类的定义 异常处理机制实现了正常程序逻辑与错误处理的分离…

安装PyTorch详细过程

安装anaconda 登录anaconda的官网下载&#xff0c;anaconda是一个集成的工具软件不需要我们再次下载。anaconda官网 跳转到这个页面如果你的Python版本正好是3.8版&#xff0c;那便可以直接根据系统去选择自己相应的下载版本就可以了。 但是如果你的Python版本号不是当前页面…

docker容器镜像管理+compose容器编排(持续更新中)

目录 一、 Docker的基本组成 二、 容器和镜像的关系 2.1 面向对象角度 2.2 从镜像容器角度 三、 容器命令 3.1 使用Ubuntu 3.1.1 下载镜像 3.1.2 新建和启动容器 run 3.1.3交互式 compose编排与部署 1. docker-compose部署 2. docker-compose.yml模板 …

JS高级_数据类型

undefined与null的区别? undefined代表没有赋值null代表赋值了, 只是值为null // 1. undefined与null的区别?var a1var a2 nullconsole.log(a1, a2)什么时候给变量赋值为null呢? var a null //已经确定a是一个对象, 但还没具体赋值&#xff08;开始&#xff09;a null …

有来团队后台项目-解析6

element-icon 引入 安装 在解析3中&#xff0c;已经安装过 创建plugins 文件夹 icons 文件 import type { App } from "vue"; import * as ElementPlusIconsVue from "element-plus/icons-vue";// 注册所有图标 export function setupElIcons(app: App…

[MySQL]数据库基础

文章目录 1.连接服务器2.理解mysql3.初见数据库4.主流数据库5.服务器&#xff0c;数据库&#xff0c;表关系6.数据逻辑存储7.MySQL架构8.SQL分类9.存储引擎 1.连接服务器 mysql -h 127.0.0.1 -P 3306 -u root -p -h&#xff1a;指明登录部署mysql服务的主机。没有写 -h 127.0.…

基于SSH的物流配送管理系统的设计与实现

摘 要 当今社会&#xff0c;物流配送已成为影响经济发展的显著因素。而随着社会信息化发展&#xff0c;建立有效的物流配送管理体系不仅能够减少物流成本&#xff0c;更能够提升工作人员的工作效率与客户的满意度。而基于B/S架构的物流配送管理体系&#xff0c;不仅具有良好的…