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

力扣hot100:除自身以外数组的乘积(除法思路和左右前缀乘积)(238)

大二课程反而更多了,前两天都没怎么学,这几天补上
题目描述

初始思路:利用除法(不符合题目要求)

我最初的想法是先计算所有非零元素的乘积,再根据数组中零的个数分情况处理:

  1. 统计零的个数 遍历数组,计算非零元素的乘积 sum,并统计零的个数 zero_count

  2. 分情况处理

    • 零的个数 > 1:所有结果均为 0。
    • 零的个数 = 1:只有零元素的位置结果为 sum,其余为 0。
    • 没有零:每个位置的结果为 总乘积 / 当前元素
public class productExceptSelf {public int[] productExceptSelf(int[] nums) {int sum=1;int[] result=new int[nums.length];int zero_count=0;for(int i=0;i<nums.length;i++){if(nums[i]!=0) {sum = sum * nums[i];}else{zero_count++;}}if(zero_count>1){for (int i = 0; i < result.length; i++) {result[i]=0;}return result;}if(zero_count==1){for (int i = 0; i < result.length; i++) {if(nums[i]==0){result[i]=sum;}else{result[i]=0;}}return result;} else {for (int i = 0; i < result.length; i++) {if (nums[i] == 0) {result[i] = sum;} else {result[i] = sum / nums[i];}}return result;}}
}

缺陷

  • 题目明确要求不能使用除法,此方案不符合要求。
  • 除法可能导致精度问题(但本题整数数组可接受)。
  • 逻辑分支较多,代码冗余。

优化思路:前缀乘积 + 后缀乘积(完美符合要求)

看了一下官方题解,还是人家名门正统的方法比较合理😂

核心思想:每个位置的结果 = 左侧所有元素的乘积 × 右侧所有元素的乘积

步骤
  1. 计算左侧乘积(从左到右遍历)

    • 初始化 res = 1(第一个元素左侧无元素)。
    • res[i] = res[i-1] * nums[i-1](存储位置 i 左侧所有元素的乘积)。
  2. 计算右侧乘积并更新结果(从右到左遍历)

    • 初始化 right = 1(最后一个元素右侧无元素)。
    • 遍历时,res[i] *= right(左侧乘积 × 右侧乘积)。
    • 更新 right *= nums[i](将当前元素纳入右侧乘积)。
代码实现
public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] res = new int[n];// 计算左侧乘积res[0] = 1;for (int i = 1; i < n; i++) {res[i] = res[i-1] * nums[i-1];}// 计算右侧乘积并更新结果int right = 1;for (int i = n - 1; i >= 0; i--) {res[i] *= right;  // 左侧乘积 × 右侧乘积right *= nums[i]; // 更新右侧乘积}return res;
}

示例分析

nums = [1, 2, 3, 4] 为例:

  1. 左侧乘积计算

    • res = 1
    • res = 1 × 1 = 1
    • res = 1 × 2 = 2
    • res = 2 × 3 = 6
    • 此时 res = [1, 1, 2, 6]
  2. 右侧乘积计算(从右到左):

    • i = 3right = 1 → res = 6 × 1 = 6,更新 right = 1 × 4 = 4
    • i = 2res = 2 × 4 = 8,更新 right = 4 × 3 = 12
    • i = 1res = 1 × 12 = 12,更新 right = 12 × 2 = 24
    • i = 0res = 1 × 24 = 24
    • 最终结果:[24, 12, 8, 6]
复杂度分析
  • 时间复杂度:O(n)O(n),两次遍历数组。
  • 空间复杂度:O(1)O(1)(输出数组不计入)。
优势
  1. 完全避免除法,符合题目要求。
  2. 无需处理零的特殊情况:零在乘法中自动将对应位置结果置零。
  3. 逻辑简洁:仅两次遍历,无复杂分支。

总结

  • 初始方案:依赖除法,需处理零的边界情况,不符合题目要求。
  • 优化方案:通过 前缀乘积 + 后缀乘积 巧妙避免除法,逻辑清晰且高效。 核心技巧:将问题拆分为左右两部分,利用两次遍历累积结果。遇到类似题目时(如前缀和、累积乘积),此思路可举一反三。

最终推荐代码

public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] res = new int[n];res[0] = 1;for (int i = 1; i < n; i++) {res[i] = res[i-1] * nums[i-1];}int right = 1;for (int i = n-1; i >= 0; i--) {res[i] *= right;right *= nums[i];}return res;
}


文章转载自:

http://Ve51MOYd.fhcwm.cn
http://PfsWisZ7.fhcwm.cn
http://FfGjUmf6.fhcwm.cn
http://Eyj3YSSn.fhcwm.cn
http://aCDCelvm.fhcwm.cn
http://OR7KISNw.fhcwm.cn
http://VfGudDrd.fhcwm.cn
http://vUndYUYH.fhcwm.cn
http://lCWLwbBL.fhcwm.cn
http://gSlbAqkB.fhcwm.cn
http://FgAPNuZU.fhcwm.cn
http://wMeywZW5.fhcwm.cn
http://HaG3lOav.fhcwm.cn
http://RqYBMi3q.fhcwm.cn
http://e9xwFymi.fhcwm.cn
http://iKf0a5ri.fhcwm.cn
http://doDx2Ayd.fhcwm.cn
http://6BSfG7Ci.fhcwm.cn
http://moBmuV3h.fhcwm.cn
http://BYkZQkKf.fhcwm.cn
http://sB18Wwkl.fhcwm.cn
http://SGnpgs7B.fhcwm.cn
http://ny1oW6vP.fhcwm.cn
http://mbVpftbA.fhcwm.cn
http://95aWkNqW.fhcwm.cn
http://LynX3Gr4.fhcwm.cn
http://NYfgq8kY.fhcwm.cn
http://QIp7qY92.fhcwm.cn
http://5ZTD7DqM.fhcwm.cn
http://S8QTOfvz.fhcwm.cn
http://www.dtcms.com/a/363262.html

相关文章:

  • 静态ip软件哪个好用?资深用户的选择指南
  • Vite 插件 @vitejs/plugin-legacy 深度解析:旧浏览器兼容指南
  • 快速实现PLC之间的通信-基恩士
  • Spring Boot 全局字段处理最佳实践
  • 【程序员必备的Linux信号处理知识】
  • 【通用视觉框架】基于Python+OpenCV+PyQt5开发的视觉框架软件,全套源码,开箱即用
  • 变频器实习DAY41 单元测试介绍
  • % g++ *.cpp ...: fatal error: ‘opencv2/opencv.hpp‘ file not found 1
  • 趣味学RUST基础篇(错误处理)
  • Delphi 5 操作Word表格选区问题解析
  • 大数据毕业设计选题推荐-基于大数据的电脑硬件数据分析系统-Hadoop-Spark-数据可视化-BigData
  • 水电站电动机绝缘安全 “不掉线”!在线监测方案筑牢发电保障
  • ReactAgent接入MCP服务工具
  • 拷打字节面试官之-吃透c语言-哈希算法 如何在3面拷打字节cto 3万行算法源码带你吃透算法面试所有考题
  • C/C++条件编译:深入理解#ifndef/#endif守卫
  • 20.Linux进程信号(一)
  • C++拷贝语义和移动语义,左值引用与右值引用
  • 汉得H-AI飞码智能编码助手V1.2.4正式发布!
  • Turso数据库:用Rust重构的下一代SQLite——轻量级嵌入式数据库的未来选择
  • 三维重建——基础理论(四):三维重建基础与极几何原理(三维重建基础、单视图回忆、双目视觉、极几何、本质矩阵与基础矩阵、基础矩阵估计)
  • 虚实交互新突破:Three.js融合AR技术的孪生数据操控方法
  • 什么是 AWS 和 GCE ?
  • 解决Mac电脑连接蓝牙鼠标的延迟问题
  • 对于牛客网—语言学习篇—编程初学者入门训练—复合类型:BC140 杨辉三角、BC133 回型矩阵、BC134 蛇形矩阵题目的解析
  • A-Level课程选择与机构报名指南
  • 净利润超10亿元,智能类产品18倍增长!顾家家居2025年半年报业绩:零售增长强劲,整家定制多维突破,全球深化布局!|商派
  • Selenium核心技巧:元素定位与等待策略
  • 苹果内部 AI聊天机器人“Asa”曝光,为零售员工打造专属A
  • 【国内外云计算平台对比:AWS/阿里云/Azure】
  • react用useImages读取图片,方便backgroundImage