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

网站可以用什么做义乌进货网平台

网站可以用什么做,义乌进货网平台,网站文件验证,深圳办公室装修设计公司Problem: 238. 除自身以外数组的乘积 题目:给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内…

Problem: 238. 除自身以外数组的乘积
题目:给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
不要使用除法,且在 O(n) 时间复杂度内完成此题。

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N)
    • 空间复杂度:O(N)

整体思路

这段代码旨在解决一个经典的数组问题:除自身以外数组的乘积 (Product of Array Except Self)。问题要求计算一个 ans 数组,其中 ans[i] 等于输入数组 nums 中除 nums[i] 之外所有元素的乘积。一个重要的约束是,不能使用除法运算。

该算法采用了一种非常巧妙的 前缀积与后缀积 相结合的策略。它将复杂的计算分解为两个更简单的、可预处理的步骤。

  1. 核心思想:分解问题

    • 对于任意索引 ians[i] 的值可以看作是两部分的乘积:
      • 前缀积 (Prefix Product)nums[i] 左侧所有元素的乘积,即 nums[0] * nums[1] * ... * nums[i-1]
      • 后缀积 (Suffix Product)nums[i] 右侧所有元素的乘积,即 nums[i+1] * nums[i+2] * ... * nums[n-1]
    • 将这两部分相乘,ans[i] = (前缀积) * (后缀积),就得到了除 nums[i] 以外所有元素的乘积。
  2. 预处理:计算前缀积和后缀积数组

    • 算法创建了两个辅助数组 preMultisufMulti 来存储所有可能的前缀积和后缀积。
    • 计算前缀积:通过一次从左到右的遍历,计算 preMulti 数组。preMulti[i] 被设计用来存储 nums[0...i-1] 的乘积。状态转移关系是 preMulti[i+1] = preMulti[i] * nums[i],其基础是 preMulti[0] = 1(空前缀的乘积为1)。
    • 计算后缀积:通过一次从右到左的遍历,计算 sufMulti 数组。sufMulti[i] 被设计用来存储 nums[i+1...n-1] 的乘积。状态转移关系是 sufMulti[j-1] = sufMulti[j] * nums[j],其基础是 sufMulti[n] = 1(空后缀的乘积为1)。
  3. 合成最终结果

    • 在两个辅助数组都填充好之后,最后通过一次遍历来构建 ans 数组。
    • 对于每个索引 i,直接从预处理好的数组中取出相应的前缀积和后缀积相乘,即 ans[i] = preMulti[i] * sufMulti[i]

通过这种“空间换时间”的策略,算法避免了在计算每个 ans[i] 时都进行重复的乘法运算,从而实现了线性时间的解决方案。

完整代码

class Solution {/*** 计算一个数组,其中 ans[i] 等于 nums 中除 nums[i] 之外所有元素的乘积。* @param nums 输入的整数数组* @return 结果数组*/public int[] productExceptSelf(int[] nums) {int n = nums.length;// ans: 最终的结果数组int[] ans = new int[n];// preMulti: 存储前缀积。preMulti[i] 表示 nums[0]...nums[i-1] 的乘积。int[] preMulti = new int[n + 1];// sufMulti: 存储后缀积。sufMulti[i] 表示 nums[i+1]...nums[n-1] 的乘积。int[] sufMulti = new int[n + 1];// 初始化两个辅助数组的所有元素为 1。// 1 是乘法单位元,作为计算的起点(空前缀/后缀的积为1)。Arrays.fill(preMulti, 1);Arrays.fill(sufMulti, 1);// 步骤 1: 从左到右计算前缀积for (int i = 0; i < n; i++) {// preMulti[i+1] 是 preMulti[i] (nums[0...i-1]的积) 乘以当前元素 nums[i]preMulti[i + 1] = preMulti[i] * nums[i];}// 步骤 2: 从右到左计算后缀积// 注意循环从 n-1 开始,并且更新的是 j-1 的位置for (int j = n - 1; j > 0; j--) {// sufMulti[j-1] 是 sufMulti[j] (nums[j+1...n-1]的积) 乘以当前元素 nums[j]sufMulti[j - 1] = sufMulti[j] * nums[j];}// 步骤 3: 合成最终结果// 对于每个索引 i,其结果是其左侧所有元素的乘积与右侧所有元素的乘积的组合for (int i = 0; i < n; i++) {// ans[i] = (nums[0...i-1]的积) * (nums[i+1...n-1]的积)// 这恰好等于 preMulti[i] * sufMulti[i]ans[i] = preMulti[i] * sufMulti[i];}return ans;}
}

时空复杂度

时间复杂度:O(N)

  1. 初始化Arrays.fill 对两个长度为 N+1 的数组进行填充,时间复杂度为 O(N) + O(N) = O(N)。
  2. 前缀积计算:第一个 for 循环遍历 nums 数组一次,执行 N 次操作。时间复杂度为 O(N)
  3. 后缀积计算:第二个 for 循环从 n-11,执行 N-1 次操作。时间复杂度为 O(N)
  4. 结果合成:第三个 for 循环遍历 n 次以填充 ans 数组。时间复杂度为 O(N)

综合分析
算法的总时间复杂度由几个独立的线性扫描组成:O(N) + O(N) + O(N) + O(N)。因此,最终的时间复杂度是 O(N)

空间复杂度:O(N)

  1. 主要存储开销:算法创建了三个与输入规模相关的数组:ans, preMulti, 和 sufMulti
    • int[] ans = new int[n]: 占用了 O(N) 的空间。在一些语境下,输出结果不计入额外空间,但这里我们分析总占用。
    • int[] preMulti = new int[n + 1]: 占用了 O(N) 的额外辅助空间。
    • int[] sufMulti = new int[n + 1]: 占用了 O(N) 的额外辅助空间。

综合分析
算法所需的额外辅助空间主要由 preMultisufMulti 两个数组决定。因此,其空间复杂度为 O(N) + O(N) = O(N)

【LeetCode 热题 100】238. 除自身以外数组的乘积——(解法二)前缀积与后缀积+优化空间复杂度

http://www.dtcms.com/a/531420.html

相关文章:

  • 邮箱注册过的网站查询云翼计划wordpress
  • 贵阳有哪家做网站建设好点的触摸网站手机
  • 网站制作建设飞沐长沙做医院的网站建设
  • 格子铺网站建设方案企业公示信息查询系统陕西
  • 医院关于建设官方网站的请示天翼云主机怎么建设网站
  • 建一个私人彩票网站2023网页游戏排行榜
  • 网站宣传夸大处罚手机兼职赚钱一单一结学生
  • 做什么网站广告拍摄
  • 沧州网站建设公司株洲网站的建设
  • 网站标题大全网站建设项目化教程
  • wordpress查看数据库密码苏州网站优化建设
  • 做网站还有钱赚吗什么语言建手机网站
  • wordpress is page西安seo招聘
  • 建设网站都需要哪些资料如何提升网站的收录量
  • 现在做网站用什么软件建设银行官方网站app下载
  • 做网站点做幼儿英语的教案网站
  • 网站推广的技巧Wordpress搜索验证登录
  • 黄石网站制作学校校园网站使用
  • 网站建设推广小王昆明微商城开发
  • 建设银行网站无法登陆池州网站制作公
  • 国外大型网站电商培训机构哪家好
  • 网站平台项目交接需要什么设计团队名称创意
  • 郑州企业建设网站技术软件工程属于哪个大类
  • 网站域名的选择方法招远专业做网站公司
  • 西宁思帽网站建设贵州省建设厅网站多少
  • 如何做盗版网站徐州建站服务
  • 好的设计作品网站企业微信小程序制作
  • 网站开发的前端和后端有哪些框架做个外贸网站一般需要多少钱
  • 天猫优惠券网站怎么做网页设计代码范例
  • 金融网站设计方案网页版微信怎么登录