当前位置: 首页 > news >正文

(前缀和) LeetCode 238. 除自身以外数组的乘积

一. 题目描述

原题链接

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

二. 解题思路

本题意思是计算每一个nums[i]的值,其中nums[i] 的值为除自身以外的其他值的乘积。

首先我们定义两个数组 left 和 right ,其中 left 数组用来计算数组的前缀和,right 数组用来计算数组的后缀和,至于最终计算结果我们只需要在原数组上操作即可,省略了空间的浪费,nums[i] 的最终结果就等于nums[i - 1] 的前缀和乘 nums[i + 1] 的后缀和,即 nums[i]  = left[i - 1] * right[i + 1]。

但是在计算nums[0] 和nums[n - 1] 的时候我们发现会出现数组越界错误,所以我们将 left 数组元素统一后移一位,然后将 left[0] 赋予 1,将 right 数组扩展一位,right[n] 赋予1 。所以就可以得出:nums[i] = left[i] * right[i + 1] (原本是 left[i - 1] * right[i + 1],但是 left 元素统一后移一位,所以下标也会移动,但是 right  数组只是扩展,对下标未改动);

运算过程如图所示:

三. 代码

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();int sum = 0;vector<int> left(n + 1);vector<int> right(n + 1);left[0] = 1;right[n] = 1;for(int i = 0; i < n; i++){left[i + 1] = nums[i] * left[i];}for(int i = n - 1; i >= 0; i--){right[i] = right[i + 1] * nums[i];}for(int i = 0; i < n; i++){nums[i] = left[i] * right[i + 1];}return nums;}
};

四. 总结

本题属于前缀和和后缀和的集合考察,属于中等题目,大家可以练习一下,但是一定要考虑在左右位置计算的时候的越界问题。

时间复杂度:O(n);

空间复杂度:O(n);

爱思考的小伙伴可以想一下本题如何用O(1)的空间复杂度实现,欢迎评论!

喜欢的话给个关注吧!!

http://www.lryc.cn/news/405631.html

相关文章:

  • 【JVM基础05】——组成-能不能解释一下方法区?
  • 前端:Vue学习-3
  • npm 安装报错(已解决)+ 运行 “wue-cli-service”不是内部或外部命令,也不是可运行的程序(已解决)
  • 江苏科技大学24计算机考研数据速览,有专硕复试线大幅下降67分!
  • 20分钟上手新版Skywalking 9.x APM监控系统
  • 【07】LLaMA-Factory微调大模型——微调模型导出与微调参数分析
  • 动态路由协议 —— EIGRP 与 OSPF 的区别
  • 【中项】系统集成项目管理工程师-第5章 软件工程-5.1软件工程定义与5.2软件需求
  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号1
  • Windows11(24H2)LTSC长期版下载!提前曝光Build26100?
  • 【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十三章 驱动模块传参
  • uniapp 小程序 支付逻辑处理
  • scikit-learn库学习之make_regression函数
  • 经典文献阅读之--World Models for Autonomous Driving(自动驾驶的世界模型:综述)
  • 孙健提到的实验室的研究方向之一是什么?()
  • 初级java每日一道面试题-2024年7月23日-Iterator和ListIterator有什么区别?
  • 2024-07-23 Unity AI行为树2 —— 项目介绍
  • Unity-URP-SSAO记录
  • 无人机上磁航技术详解
  • 使用 cURL 命令测试网站响应时间
  • 「网络通信」HTTP 协议
  • 科普文:后端性能优化的实战小结
  • LeetCode-day23-3098. 求出所有子序列的能量和
  • CSS3雷达扫描效果
  • 单例模式懒汉模式和饿汉模式
  • python __repr__和__str__区别
  • huawei USG6001v1学习----NAT和智能选路
  • FPGA JTAG最小系统 EP2C5T144C8N
  • Android 15 之如何快速适配 16K Page Size
  • 学习unity官方的网络插件Netcode【一】