LeetCode 熱題 100 238. 除自身以外數組的乘積

LeetCode 熱題 100 | 238. 除自身以外數組的乘積

大家好,今天我們來解決一道經典的算法問題——除自身以外數組的乘積。這道題在 LeetCode 上被標記為中等難度,要求在不使用除法的情況下,計算數組中每個元素的乘積,其中每個元素的值是數組中除自身以外其余各元素的乘積。


問題描述

給你一個整數數組 nums,返回數組 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積。

題目數據保證數組 nums 之中任意元素的全部前綴元素和后綴的乘積都在 32 位整數范圍內。

示例 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 <= 10^5
  • -30 <= nums[i] <= 30
  • 輸入保證數組 answer[i] 在 32 位整數范圍內

解題思路

核心思想
  1. 前綴和后綴乘積

    • 使用兩個數組 leftright 分別存儲每個位置的前綴乘積和后綴乘積。
    • left[i] 表示從數組開頭到位置 i-1 的所有元素的乘積。
    • right[i] 表示從位置 i+1 到數組末尾的所有元素的乘積。
    • 最終結果 answer[i]left[i] * right[i]
  2. 優化空間復雜度

    • 可以直接在結果數組 answer 中計算前綴乘積,然后從后向前計算后綴乘積,從而避免使用額外的數組。

Python代碼實現

class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:n = len(nums)answer = [1] * n# 計算前綴乘積left_product = 1for i in range(n):answer[i] = left_productleft_product *= nums[i]# 計算后綴乘積并更新結果right_product = 1for i in range(n - 1, -1, -1):answer[i] *= right_productright_product *= nums[i]return answer

代碼解析

  1. 初始化

    • answer 數組初始化為長度為 n 的列表,所有值初始化為 1。
  2. 計算前綴乘積

    • 使用變量 left_product 記錄當前元素之前的乘積。
    • 遍歷數組,更新 answer[i]left_product,然后更新 left_product
  3. 計算后綴乘積并更新結果

    • 使用變量 right_product 記錄當前元素之后的乘積。
    • 從后向前遍歷數組,更新 answer[i]answer[i] * right_product,然后更新 right_product
  4. 返回結果

    • 最終結果存儲在 answer 中。

復雜度分析

  • 時間復雜度:O(n),其中 n 是數組 nums 的長度。只需要兩次遍歷數組。
  • 空間復雜度:O(1),直接在結果數組 answer 中計算,不使用額外的數組。

示例運行

示例 1
輸入: nums = [1,2,3,4]
輸出: [24,12,8,6]
示例 2
輸入: nums = [-1,1,0,-3,3]
輸出: [0,0,9,0,0]

總結

通過前綴和后綴乘積的方法,我們可以高效地解決除自身以外數組的乘積問題。這種方法在 O(n) 時間復雜度內完成,并且只使用了常數級別的額外空間。希望這篇題解對大家有所幫助,如果有任何問題,歡迎在評論區留言討論!

關注我,獲取更多算法題解和編程技巧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904705.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【網絡編程】三、TCP網絡套接字編程

文章目錄 TCP通信流程Ⅰ. 服務器日志類實現Ⅱ. TCP服務端1、服務器創建流程2、創建套接字 -- socket3、綁定服務器 -- bind&#x1f38f;4、服務器監聽 -- listen&#x1f38f;5、獲取客戶端連接請求 -- acceptaccept函數返回的套接字描述符是什么&#xff0c;不是已經有一個了…

STM32的SysTick

SysTick介紹 定義&#xff1a;Systick&#xff0c;即滴答定時器&#xff0c;是內核中的一個特殊定時器&#xff0c;用于提供系統級的定時服務。該定時器是一個24位的遞減計數器&#xff0c;具有自動重載值寄存器的功能。當計數器到達自動重載值時&#xff0c;它會自動重新加載…

【Java項目腳手架系列】第一篇:Maven基礎項目腳手架

【Java項目腳手架系列】第一篇:Maven基礎項目腳手架 前言 在Java開發中,一個好的項目腳手架可以大大提高開發效率,減少重復工作。本系列文章將介紹各種常用的Java項目腳手架,幫助開發者快速搭建項目。今天,我們先從最基礎的Maven項目腳手架開始。 什么是項目腳手架? …

Kafka的消息保留策略是怎樣的? (基于時間log.retention.hours或大小log.retention.bytes,可配置刪除或壓縮策略)

Kafka 消息保留策略詳解 1. 核心保留機制 # Broker 基礎配置示例&#xff08;server.properties&#xff09; log.retention.hours168 # 默認7天保留時間 log.retention.bytes1073741824 # 1GB 大小限制2. 策略類型對比 策略類型配置參數執行邏輯適用場景時間刪除log.re…

五一の自言自語 2025/5/5

今天開學了&#xff0c;感覺還沒玩夠。 假期做了很多事&#xff0c;弄了好幾天的路由器、監控、錄像機&#xff0c;然后不停的出現問題&#xff0c;然后問ai&#xff0c;然后解決問題。這次假期的實踐&#xff0c;更像是計算機網絡的實驗&#xff0c;把那些交換機&#xff0c;…

安卓基礎(靜態方法)

靜態方法的特點?? ??無需實例化??&#xff1a;直接用 類名.方法名() 調用。 ??不能訪問實例成員??&#xff1a;只能訪問類的靜態變量或靜態方法。 ??內存中只有一份??&#xff1a;隨類加載而初始化&#xff0c;生命周期與類相同。 // 工具類 MathUtils publi…

EasyRTC嵌入式音視頻通話SDK驅動智能硬件音視頻應用新發展

一、引言 在數字化浪潮下&#xff0c;智能硬件蓬勃發展&#xff0c;從智能家居到工業物聯網&#xff0c;深刻改變人們的生活與工作。音視頻通訊作為智能硬件交互與協同的核心&#xff0c;重要性不言而喻。但嵌入式設備硬件資源受限&#xff0c;傳統音視頻方案集成困難。EasyRT…

《數字圖像處理(面向新工科的電工電子信息基礎課程系列教材)》封面顏色空間一圖的選圖歷程

禹晶、肖創柏、廖慶敏《數字圖像處理&#xff08;面向新工科的電工電子信息基礎課程系列教材&#xff09;》 學圖像處理的都知道&#xff0c;彩色圖像的顏色空間很多&#xff0c;而且又是三維&#xff0c;不同的角度有不同的視覺效果&#xff0c;MATLAB的圖又有有box和沒有box。…

Flutter 異步原理-Zone

前言 Zone 是 Dart 異步模型中的核心機制&#xff0c;主要用于&#xff1a; 隔離異步上下文&#xff0c;形成邏輯上的執行環境。捕獲未處理的異步異常&#xff0c;保證系統穩定。自定義異步任務的調度行為&#xff08;比如微任務、Timer&#xff09;。 什么是 Zone&#xff1…

聊一聊自然語言處理在人工智能領域中的應用

目錄 一、智能交互與對話系統 二、 信息提取與文本分析 三、機器翻譯與跨語言應用 四、內容生成與創作輔助 五、 搜索與推薦系統 六、垂直領域的專業應用 七、關鍵技術支撐 自然語言處理NLP屬于AI的一個子領域&#xff0c;專注于讓機器理解和生成人類語言&#xff0c;比…

Redis的過期設置和策略

Redis設置過期時間主要有以下幾個配置方式 expire key seconds 設置key在多少秒之后過期pexpire key milliseconds 設置key在多少毫秒之后過期expireat key timestamp 設置key在具體某個時間戳&#xff08;timestamp:時間戳 精確到秒&#xff09;過期pexpireat key millisecon…

vite:npm 安裝 pdfjs-dist , PDF.js View 預覽功能示例

pdfjs-dist 是 Mozilla 的 PDF.js 庫的預構建版本&#xff0c;能讓你在項目里展示 PDF 文件。下面為你介紹如何用 npm 安裝 pdfjs-dist 并應用 pdf.js 和 pdf.worker.js。 為了方便&#xff0c;我將使用 vite 搭建一個原生 js 項目。 1.創建項目 npm create vitelatest pdf-v…

【Android】動畫原理解析

一,基礎動畫 基礎動畫,有四種,分別是平移(Translate)、縮放(Scale)、Rorate(旋轉)、Alpha(透明度),對應Android中以下四種。 1,Animation基類 1,基本概念 1,插值器 插值器的作用,是控制動畫過程的參數,可以理解為 時間(t)與動畫進程(d)的函數,動畫僅…

手撕基于AMQP協議的簡易消息隊列-2(所用第三方庫的介紹與簡單使用)

第三方庫的介紹 Protobuf 什么是Protobuf&#xff08;Protocol Buffer&#xff09;&#xff1f; Protobuf是數據結構序列化和反序列化框架 Protobuf的特點有哪些&#xff1f; 通用性&#xff1a;語??關、平臺?關。即 ProtoBuf ?持 Java、C、Python 等多種語?&#xf…

Altera系列FPGA實現圖像視頻采集轉HDMI/LCD輸出,提供4套Quartus工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目Altera系列FPGA相關方案推薦 3、設計思路框架工程設計原理框圖輸入Sensor之-->OV7725攝像頭輸入Sensor之-->OV5640攝像頭輸入Sensor之-->串口傳圖輸入圖像緩…

ABP vNext 集成 CAP + RabbitMQ 實現可靠事件總線

&#x1f680; ABP vNext 集成 CAP RabbitMQ 實現可靠事件總線 在分布式系統中&#xff0c;事件總線是實現服務解耦與最終一致性的核心手段。本文將以 ABP vNext 8.1 為基礎&#xff0c;手把手教你如何集成 CAP RabbitMQ 構建可靠的事件驅動架構。 &#x1f3af; 本文適用于…

Linux 服務器靜態 IP 配置初始化指南

? 第一步&#xff1a;確認網絡管理方式 運行以下命令判斷系統使用的網絡管理服務&#xff1a; # 檢查 NetworkManager 是否活躍 systemctl is-active NetworkManager# 檢查 network&#xff08;舊服務&#xff09;是否活躍 systemctl is-active network或者檢查配置路徑&…

C++ 工具鏈與開發實踐:構建安全、高效與創新的開發生態

引言 在 C 的技術演進中&#xff0c;工具鏈的革新與開發實踐的迭代始終是推動語言生命力的核心動力。從內存安全的攻防體系到嵌入式設備的能效優化&#xff0c;從跨平臺開發的降本增效到開發者社區的生態構建&#xff0c;C 正通過工具鏈與方法論的雙重升級&#xff0c;應對復雜…

跨瀏覽器自動化測試的智能生成方法

一、背景與挑戰&#xff1a;跨瀏覽器測試為什么“難”&#xff1f; 在現代Web應用開發中&#xff0c;跨瀏覽器兼容性是用戶體驗的底線保障。面對Chrome、Firefox、Safari、Edge乃至IE、移動瀏覽器等多種運行環境&#xff0c;開發者與測試人員常面臨&#xff1a; 相同DOM在不同…

【Hive入門】Hive安全管理與權限控制:用戶認證與權限管理深度解析

目錄 引言 1 Hive安全管理體系概述 2 Hive用戶認證機制 2.1 Kerberos集成認證 2.1.1 Kerberos基本原理 2.1.2 Hive集成Kerberos配置步驟 2.1.3 Kerberos認證常見問題排查 2.2 LDAP用戶同步 2.2.1 LDAP協議概述 2.2.2 Hive集成LDAP配置 2.2.3 LDAP與Hive用戶同步架構…