力扣面试经典算法150题:除自身以外数组的乘积

news2024/9/20 9:10:53

除自身以外数组的乘积算法详解

今天的题目是力扣面试经典150题中的数组的中等难度题:除自身以外数组的乘积。

题目链接:https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&envId=top-interview-150

问题描述

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请不要使用除法,且在 O(n) 时间复杂度内完成此题。

  • 示例 1:

    • 输入:
      nums = [1,2,3,4]

    • 输出:
      [24,12,8,6]

    • 解释: 对于每个位置 i,output[i] 是 nums 中除 nums[i] 以外所有元素的乘积。

  • 示例 2:

    • 输入:
      nums = [-1,1,0,-3,3]

    • 输出:
      [0,0,9,0,0]

    • 解释: 对于每个位置 i,output[i] 是 nums 中除 nums[i] 以外所有元素的乘积。

题目分析

先看题目要求,给定数组,输出一个数组,并且这个数组的每个元素的值,是给定数组除当前位置外所有元素的乘积。

我们再看示例,也很明显:

  • 24 = 2x3x4
  • 12 = 1x3x4
  • 8 = 1x2x4
  • 6 = 1x2x3
  • 0 = 1x0x-3x3
  • 0 = -1x0x-1x3
  • 9 = -1x1x-3x3
  • 0 = -1x1x0x3
  • 0 = -1x1x0x-3

那么,对题目要求我们已经明确了,再看题目其他信息:请不要使用除法,且在 O(n) 时间复杂度内完成此题。

正常情况下,这种求除自身元素外乘积的题目,直接所有元素相乘再除自身就能得到答案(求和,差,商类似),但是题目要求我们不能用除法,所以这个解法直接排除。

在 O(n) 时间复杂度内完成此题,这句话就明确了,我们解答题目,最多只能一层for循环,这样才能保证时间复杂度在O(n),但是题目没有要求空间复杂度,所以我们考虑用多个数组来实现解题。

解题思路

题目要求新数组元素的值是除自身外的所有元素的乘积,是不是可以理解为 元素左边的所有元素的乘积与元素右边所有元素的乘积再相乘呢?另外,由于首个位置的元素和最后位置的元素缺失一边的元素乘积,为了不影响结果,我们可以设定缺失的那边值为1。

由此,我们针对示例的分析可以修改如下:

  • 24 = 1(假定的左边乘积) x (2x3x4)(右边的乘积)
  • 12 = 1(左边的乘积)x(3x4)(右边的乘积)
  • 8 = (1x2)(左边的乘积)x4(右边的乘积)
  • 6 = (1x2x3)(左边的乘积)x1(假定的右边乘积)

另外在分析的时候,我们已经考虑了用多个数组实现解题,因为多个数组分多次循环,不改变时间复杂度为O(n),只是影响空间复杂度。

所以我们可以直接设定两个数组,一个数组计算元素左边的乘积,一个元素计算右边的乘积,最后相乘,即可得到答案。

当然,实际计算的时候,我们在计算第二个数组的乘积的时候,将第一个数组的乘积相乘即可。

实际算法代码

以下是使用上述思路的 Java 实现:

public class ProductExceptSelf {
   public static void main(String[] args) {
        ProductExceptSelf solution = new ProductExceptSelf();
        int[] nums1 = {1, 2, 3, 4};
        int[] result1 = solution.productExceptSelf(nums1);
        System.out.println(Arrays.toString(result1)); // 输出: [24, 12, 8, 6]

        int[] nums2 = {-1, 1, 0, -3, 3};
        int[] result2 = solution.productExceptSelf(nums2);
        System.out.println(Arrays.toString(result2)); // 输出: [0, 0, 9, 0, 0]
    }

    public int[] productExceptSelf(int[] nums) {
        int length = nums.length;
        int[] answer = new int[length];

        // 从左向右计算左侧所有元素的乘积
        answer[0] = 1;
        for (int i = 1; i < length; i++) {
            answer[i] = nums[i - 1] * answer[i - 1];
        }

        // 从右向左计算右侧所有元素的乘积
        int R = 1;
        for (int i = length - 1; i >= 0; i--) {
            answer[i] = answer[i] * R;
            R *= nums[i];
        }

        return answer;
    }
}

结果

运行代码,结果符合:

在这里插入图片描述

提交到力扣,也通过测试:

在这里插入图片描述

总结

通过两个数组的方式,我们分别对左右相乘,再将最终结果相乘,成功得到答案,类似的和,差,商的题目一样的解法。做这些题目,一定要归纳总结出一些自己的东西,而不是盲目的解题,看解析。

加油!!!

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

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

相关文章

docker基础到进阶

基础 文章目录 基础1.Docker简介2.Docker基础概念3.Docker安装4.Docker命令4.1 镜像命令4.2 容器命令 5. 数据卷5.1具名挂载5.2 匿名挂载 进阶1. 镜像5.2 Dockerfile5.3 网络1.网络模式2.网络操作 DockerCompose1.基本语法 总结 这篇文章记录了以下的内容&#xff1a; 1️⃣ 利…

达梦数据库的系统视图v$object_usage

达梦数据库的系统视图v$object_usage 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$OBJECT_USAGE 视图提供了关于数据库对象的使用情况和统计信息。这些对象可以包括表、索引、视图、存储过程等。通过 V$OBJECT_USAGE 视图&#xff0c;数据库管理员可以监…

如何使用Hive构建网络电视剧收视率分析系统:大数据实战教程

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

什么?入网小助手无法卸载?我来手把手教你

简介 之前装了 XXXXX 公司的入网小助手&#xff0c;卸载的时候发现要验证码&#xff0c;我这小脾气就上来了&#xff0c;对待流氓软件是可忍熟不可忍&#xff01;&#xff01;&#xff01; 这里介绍的只是一种方式&#xff0c;嫌麻烦的可以进入安全模式直接删除安装目录内容&…

操作系统----锁

锁 锁就是一个变量 为什么需要锁&#xff1f;&#xff1a;&#xff1a;需要原子性的执行一系列的操作指令&#xff0c;程序员在源代码中加锁&#xff0c;放在临界区周围&#xff0c;保证临界区能够像单条原子指令一样执行。 举例说明 锁&#xff08;通常是一个互斥量mutex&…

大数据5v特性、集群、分布式

目录 数据分析六部曲 大数据的特点 &#xff08;5v特征&#xff09; 分布式与集群的区别 常用的分布式方案 数据分析六部曲 明确分析目的和思路&#xff1a;确保分析框架的体系化和逻辑性&#xff0c;简单来说就是先分析什么&#xff0c;后分析什么&#xff0c;使得各个分析…

K-means算法原理及应用场景

1. 算法原理 K-means是一种广泛使用的聚类算法&#xff0c;其目标是将数据点划分为K个簇&#xff0c;使得簇内的点尽可能地接近簇中心&#xff08;质心&#xff09;&#xff0c;而簇间的点则尽可能地远离。算法的核心思想是最小化簇内的平方误差。 过程&#xff1a; 初始化&a…

命题的相关知识

一、推论 推论由前提和结论两部分构成。前提和结论部分都是命题。 命题是推论的基本单位 命题特点&#xff1a;1、是陈述句 2、有确定的值&#xff08;不是对就是错&#xff09; 知不知道真假不重要&#xff0c;有真假就行 连接词和简单命题组成了复合命题。 二、…

前端:html+css:伪类画箭头(实心)

一、效果图 二、代码 html <div class"rectangle">AC/DC</div> css /* 图形 */ .rectangle {position: relative;width: 50px;height: 20px;background-color: #3498db;color: white; } .rectangle:before {content: ;position: absolute;top: 0;l…

Python-进阶-Excel基本操作

文章目录 Excel 基本操作1. 概述2. 写入2.1 使用 xlwt2.2 使用 XlsxWriter 3. 读取4. 修改 Excel 基本操作 1. 概述 在数据处理方面&#xff0c;Python 一直扮演着重要的角色&#xff0c;对于 Excel 操作&#xff0c;它有着完整且成熟的第三方库&#xff0c;使用也较为简单。…

用IP代理网速过慢:原因分析与解决方案

使用IP代理时网速过慢的原因及解决方案 在现代互联网环境中&#xff0c;使用IP代理已成为保护隐私的常见手段。然而&#xff0c;许多用户在使用代理时常常会遇到网速过慢的问题&#xff0c;这不仅影响了使用体验&#xff0c;还可能导致工作效率下降。本文将探讨导致IP代理网速…

Cornerstone3D Tools对影像进行交互(上篇)-基础交互工具及同步器

⛳️ 前言 在我们日常需求中&#xff0c;除了需要对影像进行可视化展示外&#xff0c;大多数场景下还需要对影像进行调整、注释、分割等操作。Cornerstone3DTools库则支持大多数需要的交互功能。CornerstoneTools支持的工具类型主要分为以下4类&#xff1a; 基础交互类工具&am…

VS2022 Cmake项目构建 Qt

一.创建文件和配置CMakeLists 1.创建头文件MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>namespace Ui {class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget* parent nullptr)…

使用Dockerfile创建应用镜像及私有仓库

目录 1.Dockerfile介绍 2.Dockerfile应用 1.创建目录 2.跳转目录 3.编辑启动脚本 4.编辑index.html文件 5.编辑 Dockerfile 6.创建镜像 7.查看镜像 8.创建容器测试 9.挂载其他项目测试 3.私有仓库 1.安装仓库镜像---仓库注册器 2.创建目录 3.启动容器、映射端口、…

读书学习笔记 # Datawhale X 李宏毅苹果书 AI夏令营

文章目录 &#x1f6a9;学习目标&#x1f6a9;学习内容&#x1f6a9; Task1.1&#x1f3af;为什么优化会失败&#x1f4cc;因非信息梯度导致的失败 &#x1f3af;局部极小值与鞍点&#x1f3af;临界点及其种类&#x1f3af;如何判断临界值种类&#x1f4cc;更简便的方法来判断 …

ubuntu环境下部署LNMP集成环境超详细图文教程

ubuntu系统下安装LNMP集成环境 一、Nginx安装 二、安装及配置MySQL数据库 修改密码 三、安装PHP 四、配置Nginx服务 ​编辑五、配置PHP 本文使用的Ubuntu版本为20.04。 php开发中集成环境的安装是必不可少的技能。 而LNMP代表的是&#xff1a;Linux系统下NginxMySQLPHP…

李沐--动手学深度学习 ResNet

1.理论 2.残差块 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l#ResNet沿用了VGG完整的3*3卷积层设计.残差块的实现如下&#xff1a; #此代码生成两种类型的网络&#xff1a; #一种是当use_1x1convFalse时&#xff0…

96.SAP MII功能详解(09)Workbench-Transaction Debugging

目录 1.About Transaction Debugging Use Features Activities 2.How to Debug Start Debugging Create Breakpoint Watch Variables Debugging logs 1.About Transaction Debugging Use You use this function to monitor and manipulate a transaction while it …

java框架第一课(mybatis认识)

一.关于mybatis 1.mybatis的背景 mybatis原来 是Apache的一个开源项目iBatis,2010年6月这个项目由ApacheSoftware Foundation 迁移到了 Google Code&#xff0c;并改名为mybatis。 2.mybitis的介绍 (1)MyBatis 是一款优秀的持久层框架(在与数据库交互,数据访问层,数据持久层)。…

深入学习SQL优化的第四天

目录 高级查询与连接 1731 每 位 经 理 的 下 属 员 工 数 量 1789 员 工 的 直 属 部 门 610 判 断 三 角 形 180 连 续 出 现 的 数 字 1164 指 定 日 期 的 产 品 价 格 1204 最 后 一 个 能 进 入 巴 士 的 人 1907 按 分 类 统 计 薪 水 子查询 1978 上…