【LeetCode】算法詳解#6 ---除自身以外數組的乘積

1.題目介紹

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

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

請?不要使用除法,且在?O(n)?時間復雜度內完成此題。

  • 2 <= nums.length <= 105
  • -30 <= nums[i] <= 30
  • 輸入?保證?數組?answer[i]?在??32 位?整數范圍內

2.解決思路

? ? ? ? 既然給定一個數組,讓求得每個位置的前綴元素和后綴元素的乘積,實際上就是分別求前綴積和后綴積。我一開始的思路是:如果每次計算前綴積和后綴積的時候都遍歷一遍就太浪費時間了,所以就想著如何減少遍歷次數,也就是利用前面遍歷過的結果,我就想到了“后一個元素的前綴積=前一個元素的前綴積*前一個元素”,這樣就可以做到前綴積無需遍歷,只需要每次相乘即可。但是這樣的問題是由于是從前向后計算,那么后綴積其實是沒辦法通過這種方式得到的,只能遍歷計算,最終時間復雜度還是O(n2)。

? ? ? ? 所以換一種思路?,能不能在計算的時候直接取到前綴積和后綴積,所以可以直接提前進行兩次計算,分別計算每個位置的前綴積和后綴積,結合上面的思路,計算前綴積和后綴積的過程都只需要一次遍歷即可。最終拿著這兩個數組按位置相乘就是最終的答案

3.步驟講解

? ? ? ? 1.先對一些特殊情況進行提前處理

? ? ? ? 2.創建前綴積數組和后綴積數組,分別用來存儲每個位置的前綴積或者后綴積

? ? ? ? 3.初始化結果數組

? ? ? ? 4.計算前綴乘積,第一個位置的前綴積為1,后面每個位置的前綴積都是上一個前綴積*上一? ? ? ? ? ? ? ?個元素值

? ? ? ? 5.計算后綴乘積,從后向前計算。最后一個位置的后綴積為1,后面每個位置的前綴積都是后? ? ? ? ? ? ? 一個后綴積*后一個元素值。

? ? ? ? 6.計算每個位置的前綴積*后綴積,也就是通過索引取得前綴積數組和后綴積數組相乘

4.代碼展示

public static int[] test2(int[] nums) {int n = nums.length;if (n == 0) return new int[0];if (n == 1) return new int[]{0};// 創建前綴乘積和后綴乘積數組int[] prefix = new int[n];int[] suffix = new int[n];//結果數組int[] results = new int[n];// 計算前綴乘積prefix[0] = 1;for (int i = 1; i < n; i++) {prefix[i] = prefix[i - 1] * nums[i - 1];}// 計算后綴乘積suffix[n - 1] = 1;for (int i = n - 2; i >= 0; i--) {suffix[i] = suffix[i + 1] * nums[i + 1];}// 計算結果for (int i = 0; i < n; i++) {results[i] = prefix[i] * suffix[i];}return results;}

5.執行結果

在leetcode中測試用例平均耗時2ms

內存分布55.04MB?

?

超時代碼示例(O(n2)):

 public static int[] test(int[] nums) {if (nums.length == 0){return new int[0];}if (nums.length == 1){return new int[]{0};}//先計算所有元素的前綴乘和后綴乘int tempPreMulti = 1;int tempSufMulti = 1;int[] results = new int[nums.length];HashMap<Integer, Integer[]> multi = new HashMap<>();for (int i = 0; i < nums.length; i++) {//計算前綴乘if (i != 0) {tempPreMulti = multi.get(i - 1)[0] * nums[i - 1];}//計算后綴乘for (int j = i+1; j < nums.length; j++) {tempSufMulti  *= nums[j];}multi.put(i, new Integer[]{tempPreMulti, tempSufMulti});//存入數組results[i] = tempPreMulti*tempSufMulti;//重置tempSufMulti = 1;tempPreMulti = 1;}return results;}

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

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

相關文章

Kubernetes 節點自動伸縮(Cluster Autoscaler)原理與實踐

在 Kubernetes 集群中&#xff0c;如何在保障應用高可用的同時有效地管理資源&#xff0c;一直是運維人員和開發者關注的重點。隨著微服務架構的普及&#xff0c;集群內各個服務的負載波動日趨明顯&#xff0c;傳統的手動擴縮容方式已無法滿足實時性和彈性需求。 Cluster Auto…

LLMs 系列科普文(11)

目前我們已經介紹了大語言模型訓練的兩個主要階段。第一階段被稱為預訓練階段&#xff0c;主要是基于互聯網文檔進行訓練。當你用互聯網文檔訓練一個語言模型時&#xff0c;得到的就是所謂的 base 模型&#xff0c;它本質上就是一個互聯網文檔模擬器&#xff0c;我們發現這是個…

深度學習環境配置指南:基于Anaconda與PyCharm的全流程操作

一、環境搭建前的準備 1. 查看基礎環境位置 conda env list 操作說明&#xff1a;通過該命令確認Anaconda默認環境&#xff08;base&#xff09;所在磁盤路徑&#xff08;如D盤&#xff09;&#xff0c;后續操作需跳轉至該磁盤根目錄。 二、創建與激活獨立虛擬環境 1. 創…

【2D與3D SLAM中的掃描匹配算法全面解析】

引言 掃描匹配(Scan Matching)是同步定位與地圖構建(SLAM)系統中的核心組件&#xff0c;它通過對齊連續的傳感器觀測數據來估計機器人的運動。本文將深入探討2D和3D SLAM中的各種掃描匹配算法&#xff0c;包括數學原理、實現細節以及實際應用中的性能對比&#xff0c;特別關注…

力扣160.相交鏈表

題目描述 難度&#xff1a;簡單 示例 思路 使用雙指針 使用指針分別指向兩個不同的鏈表進行比較 解題方法 1.首先進行非空判斷 2.初始化指針分別指向兩個鏈表 3.遍歷鏈表 while (pA ! pB)&#xff1a; 當pA和pB不相等時&#xff0c;繼續循環。如果pA和pB相等&#xff0c;說明找…

本地項目push到git

cd /home/user/project git init 添加遠程倉庫地址 git remote add origin https://github.com/user/repo.git 創建并切換到新分支 git checkout -b swift 添加文件到暫存區 git add . git commit -m “swift訓練評測” git push -u origin swift —force #首次 git push …

uni-app學習筆記二十九--數據緩存

uni.setStorageSync(KEY,DATA) 將 data 存儲在本地緩存中指定的 key 中&#xff0c;如果有多個key相同&#xff0c;下面的會覆蓋掉原上面的該 key 對應的內容&#xff0c;這是一個同步接口。數據可以是字符串&#xff0c;可以是數組。 <script setup>uni.setStorageSyn…

GitHub 趨勢日報 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…

NFC碰碰卡發視頻源碼搭建與寫卡功能開發實踐

在信息快速傳播的時代&#xff0c;便捷的數據交互方式成為用戶的迫切需求。“碰一碰發視頻” 結合寫卡功能&#xff0c;為視頻分享提供了新穎高效的解決方案&#xff0c;在社交娛樂、商業推廣等場景中展現出巨大潛力。本文將詳細介紹碰一碰發視頻源碼搭建以及寫卡功能開發的全過…

詳解K8s 1.33原地擴縮容功能:原理、實踐、局限與發展

你是否有過這樣的經歷&#xff1f; 精心配置了 Kubernetes 的 Pod&#xff0c;設置了“剛剛好”的 CPU 和內存&#xff08;至少你當時是這么想的&#xff09;&#xff0c;結果應用不是資源緊張喘不過氣&#xff0c;就是像“雙十一”搶購一樣瘋狂搶占資源。 過去&#xff0c;唯…

IOS 打包賬號發布上傳和IOS Xcode證書配置

xcode下載 https://developer.apple.com/download/all/ App發布 https://appstoreconnect.apple.com/ https://appstoreconnect.apple.com/teams/83ba877c-af24-4fa5-aaf2-e9b9b6066e82/apps/6473148620/testflight/groups/eb983352-b2e2-4c29-bbb7-071bf7287795 https://devel…

【從零學習JVM|第三篇】類的生命周期(高頻面試題)

前言&#xff1a; 在Java編程中&#xff0c;類的生命周期是指類從被加載到內存中開始&#xff0c;到被卸載出內存為止的整個過程。了解類的生命周期對于理解Java程序的運行機制以及性能優化非常重要。本文會深入探尋類的生命周期&#xff0c;讓讀者對此有深刻印象。 目錄 ?…

Significant Location Change

一、Significant Location Change是什么 “Significant Location Change&#xff08;重大位置變化&#xff09;” 是蘋果 iOS 系統中一項用于在應用未主動運行時&#xff0c;監測設備位置顯著變化的功能。它主要通過基站、Wi-Fi 網絡等信號來判斷設備是否發生了有意義的位置移…

ubuntu22.04有線網絡無法連接,圖標也沒了

今天突然無法有線網絡無法連接任何設備&#xff0c;并且圖標都沒了 錯誤案例 往上一頓搜索&#xff0c;試了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角網絡圖標消失 最后解決的辦法 下載網卡驅動&#xff0c;重新安裝 操作步驟 查看自己網卡的型號 lspci | gre…

基于cnn的通用圖像分類項目

背景 項目上需要做一個圖像分類的工程。本人希望這么一個工程可以幫助學習ai的新同學快速把代碼跑起來&#xff0c;快速將自己的數據集投入到實戰中&#xff01; 代碼倉庫地址&#xff1a;imageClassifier: 圖片分類器 代碼切到master分支&#xff0c;master分支是本地訓練圖…

【HarmonyOS 5 開發速記】如何獲取用戶信息(頭像/昵稱/手機號)

1.獲取 authorizationCode&#xff1a; 2.利用 authorizationCode 獲取 accessToken&#xff1a;文檔中心 3.獲取手機&#xff1a;文檔中心 4.獲取昵稱頭像&#xff1a;文檔中心 首先創建 request 若要獲取手機號&#xff0c;scope必填 phone&#xff0c;permissions 必填 …

從OCR到Document Parsing,AI時代的非結構化數據處理發生了什么改變?

智能文檔處理&#xff1a;非結構化數據提出的挑戰 在這個時代的每一天&#xff0c;無論是個人處理賬單&#xff0c;還是企業處理合同、保險單、發票、報告或成堆的簡歷&#xff0c;我們都深陷在海量的非結構化數據之中。這類數據不像整齊排列的數據庫表格那樣規整&#xff0c;…

Python Ovito統計金剛石結構數量

大家好,我是小馬老師。 本文介紹python ovito方法統計金剛石結構的方法。 Ovito Identify diamond structure命令可以識別和統計金剛石結構,但是無法直接輸出結構的變化情況。 本文使用python調用ovito包的方法,可以持續統計各步的金剛石結構,具體代碼如下: from ovito…

相關類相關的可視化圖像總結

目錄 一、散點圖 二、氣泡圖 三、相關圖 四、熱力圖 五、二維密度圖 六、多模態二維密度圖 七、雷達圖 八、桑基圖 九、總結 一、散點圖 特點 通過點的位置展示兩個連續變量之間的關系&#xff0c;可直觀判斷線性相關、非線性相關或無相關關系&#xff0c;點的分布密…

Git常用命令完全指南:從入門到精通

Git常用命令完全指南&#xff1a;從入門到精通 一、基礎配置命令 1. 用戶信息配置 # 設置全局用戶名 git config --global user.name "你的名字"# 設置全局郵箱 git config --global user.email "你的郵箱example.com"# 查看所有配置 git config --list…