力扣最热一百题——除自身以外数组的乘积

news2024/9/21 17:03:49

目录

题目链接:238. 除自身以外数组的乘积 - 力扣(LeetCode)

题目描述

示例

提示:

解法一:左右数组(小型动态规划)

实现思路

Java写法:

运行时间

C++写法:

运行时间

时间复杂度以及空间复杂度

总结


题目链接:238. 除自身以外数组的乘积 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

给你一个整数数组 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 位 整数范围内

进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)


解法一:左右数组(小型动态规划)

        这个问题可以通过两次遍历数组来解决,而不需要使用额外的空间(除了用于结果的数组之外),但这段代码巧妙地使用了两个辅助数组 left 和 right 来分别存储每个元素左侧所有元素的乘积和右侧所有元素的乘积,从而避免了在单次遍历中同时计算左右两侧乘积的复杂性。

实现思路

  1. 初始化
    • 首先,创建一个与输入数组 nums 长度相同的数组 left,用于存储每个元素左侧所有元素的乘积(包括元素本身位置为1的情况,因为元素本身不参与计算)。
    • 同时,创建一个与 nums 长度相同的数组 right,用于存储每个元素右侧所有元素的乘积(同样,元素本身位置为1)。
  2. 计算左侧乘积
    • 遍历 nums 数组,从左到右。
    • 对于 left 数组的每个位置 i,其值等于 nums[i-1](如果 i > 0)与 left[i-1] 的乘积。如果 i = 0,则 left[0] = 1,因为没有元素在 nums[0] 的左侧。
  3. 计算右侧乘积
    • 遍历 nums 数组,但这次是从右到左。
    • 对于 right 数组的每个位置 i,其值等于 nums[i+1](如果 i < len-1)与 right[i+1] 的乘积。如果 i = len-1,则 right[len-1] = 1,因为没有元素在 nums[len-1] 的右侧。
  4. 计算最终结果
    • 再次遍历 nums 数组,这次是为了计算每个元素的最终结果。
    • 对于 nums 数组的每个位置 i,其最终值等于 left[i](左侧所有元素的乘积)与 right[i](右侧所有元素的乘积)的乘积。
  5. 返回结果
    • 将修改后的 nums 数组返回,此时 nums 数组的每个元素都已经是除了它自身以外所有元素的乘积了。

Java写法:

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        if(len == 0){
            return nums;
        }
        // 定义出两个数组分别表示左边的乘积和右边数组的乘积
        // 这个思路有点和动态规划相似
        //       0  1  2 3
        //       1, 2, 3,4
        // left  1, 1, 2,6
        // right 24,12,4,1
        int[] left = new int[len];
        int[] right = new int[len];

        // 填入左边乘积数组的值
        // 初始化
        left[0] = 1;
        for(int i = 1; i < len ; i++){
            left[i] = nums[i - 1] * left[i - 1];
        }

        // 填入右边乘积数组的值
        right[len - 1] = 1;
        for(int i = len - 2; i >= 0 ; i--){
            right[i] = nums[i + 1] * right[i + 1];
        }

        for(int i = 0; i < len; i++){
            nums[i] = left[i] * right[i];
        }

        return nums;

    }
}
运行时间

C++写法:

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int len = nums.size();

        vector<int> left(len);
        vector<int> right(len);

        left[0] = 1;
        for(int i = 1; i < len; i++){
            left[i] = nums[i - 1] * left[i - 1];
        }

        right[len - 1] = 1;
        for(int i = len - 2; i >= 0; i--){
            right[i] = nums[i + 1] * right[i + 1];
        }

        for(int i = 0; i < len; i++){
            nums[i] = left[i] * right[i];
        }

        return nums;
    }
};
运行时间

时间复杂度以及空间复杂度


总结

        累了哥几个,最近有点焦虑了,不总结了哎

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

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

相关文章

Acwing Hash表

哈希表的作用&#xff1a;把一个比较大的空间&#xff0c;通过一个函数映射到一个比较小的空间 一般做哈希运算时&#xff0c;取一个质数作为模&#xff0c;会使得冲突的概率降低。 哈希表的冲突解决方法&#xff1a; 拉链法开放寻址法 下面详细介绍这两种方法的原理及其实现…

Java+Spring Cloud +UniApp 智慧工地源码,用户PC端、移动端数据同步,支持多端展示

数字化给各行各业所带来的改变&#xff0c;在早些年间突出自动这一流程。但随着科技的发展&#xff0c;让人们也愈发了解可视化操作所带来的优势。智慧工地的诞生&#xff0c;相当于为建筑施工带来了一套较为完整的数字化流程&#xff0c;能够完善施工环节中的各部分内容。接下…

C++【类和对象】(一)

文章目录 前言1.类的定义1.1类定义格式1.2 访问限定符1.3 类域 2. 实例化2.1 实例化的概念2.2 对象大小 3.this指针结语 前言 在前文我们讲解了C基础语法知识。本文将会讲解C的类和对象。 1.类的定义 1.1类定义格式 class name {}&#xff1b;class为定义类的关键字&#x…

8586 括号匹配检验

### 思路 1. **初始化栈**&#xff1a;创建一个空栈用于存储左括号。 2. **遍历字符串**&#xff1a;逐个字符检查&#xff1a; - 如果是左括号&#xff08;( 或 [&#xff09;&#xff0c;则入栈。 - 如果是右括号&#xff08;) 或 ]&#xff09;&#xff0c;则检查栈是…

【医学半监督】对比互补掩蔽的自监督预训练半监督心脏图像分割

SELF-SUPERVISED PRE-TRAINING BASED ON CONTRASTIVE COMPLEMENTARY MASKING FOR SEMI-SUPERVISED CARDIAC IMAGE SEGMENTATION 2024 IEEE International Symposium on Biomedical Imaging (ISBI) 摘要: 心脏结构分割对心脏病诊断非常重要,而使用大量注释的深度学习在这项任…

记录|C#的资源路径设置的资料整理

目录 前言一、在这里插入图片描述 https://bbs.csdn.net/topics/360001606 二、三、添加到资源文件中四、获得图片的三种路径方法五、给资源文件添加文件夹更新时间 前言 参考文章&#xff1a; 原本以为C# winform中进行图片等文件的路径的读取是直接可以按照资源文件中显示的来…

AI对汽车行业的冲击和比亚迪新能源汽车市场占比

人工智能&#xff08;AI&#xff09;对汽车行业的冲击正在迅速改变该行业的面貌&#xff0c;从智能驾驶到生产自动化&#xff0c;再到个性化的消费者体验&#xff0c;AI带来的技术革新在各个层面影响着汽车产业。与此同时&#xff0c;新能源汽车市场&#xff0c;特别是以比亚迪…

剑指offer JZ54 二叉搜索树的第k个节点

描述&#xff1a; 给定一棵结点数为n 二叉搜索树&#xff0c;请找出其中的第 k 小的TreeNode结点值。 1.返回第k小的节点值即可 2.不能查找的情况&#xff0c;如二叉树为空&#xff0c;则返回-1&#xff0c;或者k大于n等等&#xff0c;也返回-1 3.保证n个节点的值不一样 如…

2024 研究生数学建模竞赛(B题)建模秘籍|WLAN组网中网络吞吐量建模|文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用特征重要性分析&#xff0c;自适应回归&#xff0c;机器学习算法等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模…

使用丹摩DAMODEL平台进行ChatGLM-6B-部署与使用

实例创建 1.先进入官网https://doc.damodel.com 进行注册&#xff0c;新用户可以免费送代金券&#xff0c;实名注册后一共可以得到50块钱&#xff0c;现在4090还搞活动&#xff0c;1.5左右一个钟。 2.创建后进入DAMODEL控制台创建实例&#xff1a; 如下&#xff1a; 这里创建…

在vue中:style 的几种使用方式

在日常开发中:style的使用也是比较常见的&#xff1a; 亲测有效 1.最通用的写法 <p :style"{fontFamily:arr.conFontFamily,color:arr.conFontColor,backgroundColor:arr.conBgColor}">{{con.title}}</p> 2.三元表达式 <a :style"{height:…

Hive企业级调优[4]——HQL语法优化之分组聚合优化

HQL语法优化之分组聚合优化 优化说明 在 Hive 中&#xff0c;未经优化的分组聚合通常通过一个 MapReduce Job 实现。Map 端负责读取数据&#xff0c;并按分组字段进行分区&#xff0c;通过 Shuffle 将数据发送至 Reduce 端&#xff0c;在 Reduce 端完成最终的聚合运算。 Hiv…

进程和线程问题解答

线程和进程的概念、区别 进程是操作系统进行资源分配的基本单位&#xff0c;拥有独立的地址空间&#xff0c;包括代码、数据、堆、栈等。进程间的切换开销较大。 线程是进程中的一个执行单元&#xff0c;是系统中最小的执行单位&#xff0c;共享进程的资源&#xff0c;如代码…

利士策分享,中日核污染水排海问题共识背后的深思

利士策分享&#xff0c;中日核污染水排海问题共识背后的深思 近日&#xff0c;中日两国在应对福岛第一核电站核污染水排放问题上达成了重要共识&#xff0c;这一进展无疑值得肯定。 然而&#xff0c;这背后所引发的关于金钱、责任与利益的讨论&#xff0c;却值得我们深入探究。…

使用宝塔部署项目在win上

项目部署 注意&#xff1a; 前后端部署项目&#xff0c;需要两个域名&#xff08;二级域名&#xff0c;就是主域名结尾的域名&#xff0c;需要在主域名下添加就可以了&#xff09;&#xff0c;前端一个&#xff0c;后端一个 思路&#xff1a;访问域名就会浏览器会加载前端的代…

什么是3D展厅?有何优势?怎么制作3D展厅?

一、什么是3D展厅&#xff1f; 3D展厅是一种利用三维技术构建的虚拟展示空间。它借助虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等现代科技手段&#xff0c;将真实的展示空间数字化&#xff0c;呈现出逼真、立体、沉浸的展示效果。通过3D展厅&a…

剪映草稿批量自动化导出教程实操演示

如何批量自动导出草稿&#xff1f;今天我来实操演示。首先打开谷歌剪映助手 如果没有安装谷哥剪映助手的可以自行搜索下载&#xff0c;打开后找到批量导出多个草稿自动化导出。接着在右侧输入你要导出草稿的数量&#xff0c;其他的选项根据需求自行选择&#xff0c;最后点击立即…

【网络安全 | 靶机搭建】解决虚拟机联网问题(NAT模式)

背景:在电脑上下载并使用VMware虚拟机后,重装VMware时可能会遇到虚拟机无法联网的问题(例如,ping www.baidu.com 无法通畅)。这种情况可能是网络适配器被删除导致的。 本文将通过添加网络、安装网络适配器以及切换网络连接方式等步骤解决虚拟机的联网问题,具体步骤如下:…

笔记:将WPF中可视化元素(Visual)保存为图像,如PNG,JPEG或BMP的方法简介

一、目的&#xff1a;将WPF中可视化元素&#xff08;Visual&#xff09;保存为图像&#xff0c;如PNG,JPEG或BMP的方法简介 BitmapEncoder 是 WPF 中用于将图像数据编码为特定格式的基类。它提供了将 BitmapSource 对象保存为各种图像格式&#xff08;如 PNG、JPEG、BMP 等&…

Android 空气质量刻度

效果 attrs.xml <attr name"textSpace" format"dimension|reference" /><attr name"barSpace" format"dimension|reference" /><attr name"scaleHeight" format"dimension|reference" /><at…