除自身以外數組的乘積[中等]

優質博文:IT-BLOG-CN

一、題目

給你一個整數數組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位整數范圍內

進階:你可以在O(1)的額外空間復雜度內完成這個題目嗎?( 出于對空間復雜度分析的目的,輸出數組 不被視為 額外空間。)

二、代碼

【1】創建左右乘積列表: 我們不能將所有數字的乘積除以給定索引處的數字得到相應的答案,而是利用索引左側所有數字的乘積和右側所有數字的乘積(即前綴與后綴)相乘得到答案。初始化兩個數組LeftRight,對于指定的下表ileft[i]代表i左側所有數據的乘積,right[i]代表i右側所有數據的乘積。我們利用循環將數據填充到lfet[]right[]數組中,然后將left[i]right[i]相乘就是i的左右乘積。

class Solution {public int[] productExceptSelf(int[] nums) {if (nums == null || nums.length == 0) {return null;}// 我們使用數組,也就是當前數字的left[] 和 right[] 數組,分別存儲左右兩邊的和;int len = nums.length;int res[] = new int[len];int left[] = new int[len];int right[] = new int[len];// 第一個數之前的數的乘積為1,所以先給個默認值left[0] = 1;for (int i = 1; i < len; i++) {// left 中保存的是i之前所有數的乘積left[i] = left[i - 1] * nums[i - 1];}// 最有邊的數也保存為1right[len - 1] = 1;for (int i = len - 2; i >= 0; i--) {right[i] = right[i + 1] * nums[i + 1];}for (int i = 0; i < len; i++) {res[i] = left[i] * right[i];}return res;}
}

時間復雜度: O(N),其中N指的是數組nums的大小。預處理LR數組以及最后的遍歷計算都是O(N)的時間復雜度。
空間復雜度: O(N),其中N指的是數組nums的大小。使用了LR數組去構造答案,LR數組的長度為數組nums的大小。

【2】空間復雜度O(1)的方法: 由于輸出數組不算在空間復雜度內,那么我們可以將LR數組用輸出數組來計算。先把輸出數組當作L數組來計算,然后再動態構造R數組得到結果。

class Solution {public int[] productExceptSelf(int[] nums) {if (nums == null || nums.length == 0) {return null;}// 因為返回的數組可以不算在空間復雜度中,所以可以作為臨時變量存放left[]數據int len = nums.length;int res[] = new int[len];// // 第一個數之前的數的乘積為1,所以先給個默認值res[0] = 1;for (int i = 1; i < len; i++) {// left 中保存的是i之前所有數的乘積res[i] = res[i - 1] * nums[i - 1];}// 然后從后向前變量,通過變量 right保存前幾位數的乘積int right = 1;for (int i = len - 1; i >= 0; i--) {res[i] *= right;// 放在返回值的后面,就相當于i + 1right *= nums[i];} return res;}
}

時間復雜度: O(N),其中N指的是數組nums的大小。分析與方法一相同。
空間復雜度: O(1),輸出數組不算進空間復雜度中,因此我們只需要常數的空間存放變量。

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

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

相關文章

【Qt開發流程】之富文本處理

描述 Scribe框架提供了一組類&#xff0c;用于讀取和操作結構化的富文本文檔。與Qt中以前的富文本支持不同&#xff0c;新的類集中在QTextDocument類上&#xff0c;而不是原始文本信息。這使開發者能夠創建和修改結構化的富文本文檔&#xff0c;而不必準備中間標記格式的內容。…

【數據結構】A : A DS圖_傳遞信息

A : A DS圖_傳遞信息 Description 小明在和他的小伙伴們玩傳消息游戲&#xff0c;游戲規則如下&#xff1a; 有n名玩家&#xff0c;所有玩家編號分別為0~n-1&#xff0c;其中小明編號為0&#xff1b;每個玩家都有固定的若干個可傳信息的其他玩家(也可能沒有)。傳消息的關系是…

busybox制作根文件系統2

上篇內容使用busybox制作好了根文件系統&#xff0c;接下來需要進行一些測試和功能的完善&#xff01; 根文件系統的測試 測試根文件系統的時候不是直接燒寫到EMMC里面&#xff0c;這樣測試效率太低了&#xff0c;Ubuntu的rootfs目錄已經保存了根文件系統&#xff0c;只需要在…

向量數據庫,展望AGI時代

無論是向量數據庫&#xff0c;還是大模型&#xff0c;歸根結底&#xff0c;大家在追捧它時的心態&#xff0c;焦慮大于需求。 向量數據庫的熱潮&#xff0c;在一定程度上“外化”了人們的焦慮。 但這并不能否定向量數據庫的實際價值&#xff0c;甚至更長遠來看&#xff0c;向…

【C++】linux下的gdb程序調試

目錄 【C】Linux 下的 GDB 程序調試1. 安裝 GDB2. 編譯程序3. 啟動 GDB4. 設置斷點5. 執行程序6. 調試命令7. 調試崩潰8. 結束調試 【C】Linux 下的 GDB 程序調試 在開發 C 程序時&#xff0c;出現 bug 是常見的。調試是找出程序錯誤的關鍵步驟之一。在 Linux 環境下&#xff…

RedisTemplate使用詳解

RedisTemplate介紹StringRedisTemplate介紹RedisConnectionFactory介紹RedisConnectionFactory源碼解析 RedisOperations介紹RedisOperations源碼解析 RedisTemplate使用連接池配置RedisTemplate連接池連接池配置 RedisTemplate應用場景RedisTemplate主要特點RedisTemplate使用…

redis運維(十六) 有序集合

一 有序集合 把握一點&#xff1a; 各種redis 命令都提供各種語言對應的API 接口,后續API是關鍵 ① 概念 1、sorted set --> 有序集合2、redis有序集合也是集合類型的一部分&#xff0c;所以它保留了集合中元素不能重復的特性3、但是不同的是,有序集合給每個元素多設置…

什么是數字孿生?

數字孿生是指通過數字化技術手段&#xff0c;將現實世界中的實體物理系統或過程與其數字化模型相連接&#xff0c;實現實體物理系統或過程的虛擬仿真、監測、預測和優化等功能的一種技術。數字孿生技術可以將物理系統的運行狀態、性能參數、故障信息等實時反饋到數字模型中&…

轉型做視頻了,博客就是稿子,繼續堅持寫博客,同時發布視頻,能寫博客說明思路清晰了,能再講明白,理解就更透徹了,緊跟上時代發展。

1&#xff0c;今天特別記錄下&#xff0c;B站給開通了《合集》功能 最近使用視頻制作了幾個視頻。播放量還不錯&#xff0c;最好的已經到了 2.6K了。 然后粉絲也漲到了 200個。 添加鏈接描述 緊跟時代&#xff1a;從寫博客到錄視頻&#xff0c;粉絲大漲&#xff0c;突破200個&…

vue開發一、在Vue中引入ElementUI二、在Vue中使用阿里圖標庫

目錄 一、在Vue中引入ElementUI1. 安裝ElementUI2. 引入ElementUI3. 使用ElementUI組件 二、在Vue中使用阿里圖標庫1. 在阿里圖標庫中選擇圖標2. 下載圖標3. 引入圖標4. 使用圖標 總結 一、在Vue中引入ElementUI ElementUI是一種基于Vue的第三方UI庫&#xff0c;提供了許多常用…

接口自動化測試 —— 工具、請求與響應

一、工具&#xff1a; 1.工具介紹 postman &#xff1a;很主流的API測試工具&#xff0c;也是工作里面使用最廣泛的研發工具。 JMeter&#xff1a; ApiPost&#xff1a; 2.安裝postman&#xff1a; 安裝好直接打開&#xff0c;不用注冊。 二、通信模式&#xff1a; 1、…

【Java 進階篇】從Java對象到JSON:Jackson的魔法之旅

在現代的軟件開發中&#xff0c;處理數據的能力是至關重要的。而當我們談及數據格式時&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;通常是首選。為了在Java中輕松地將對象轉換為JSON&#xff0c;我們需要一種強大而靈活的工具。這時&#xff0c;Jackso…

【Java 進階篇】Redis:打開緩存之門

介紹 Redis&#xff08;Remote Dictionary Server&#xff09;是一個高性能的鍵值對存儲系統&#xff0c;被廣泛用作緩存、消息中間件和數據庫。它以其快速的讀寫能力、支持多種數據結構和豐富的功能而聞名。在這篇博客中&#xff0c;我們將深入了解Redis的概念、安裝以及基本…

MQTT協議消息代理服務遠程連接

目錄 1. Linux 搭建 Mosquitto 2. Linux 安裝Cpolar 3. 創建MQTT服務公網連接地址 4. 客戶端遠程連接MQTT服務 5. 代碼調用MQTT服務 6. 固定連接TCP公網地址 7. 固定地址連接測試 Mosquitto是一個開源的消息代理&#xff0c;它實現了MQTT協議版本3.1和3.1.1。它可以在不…

第二十章:多線程

進程 線程的特點 1.進程是資源分配的最小單位&#xff0c;線程是最小的執行單位 2.一個進程可以有多個線程 3.線程共享進程資源 package twentyth; public class ThreadTest extends Thread { public void run() { for (int i 1; i < 10; i) {//繼承重…

Unity開發之C#基礎-File文件讀取

前言 今天我們將要講解到c#中 對于文件的讀寫是怎樣的 那么沒接觸過特別系統編程小伙伴們應該會有一個疑問 這跟文件有什么關系呢&#xff1f; 我們這樣來理解 首先 大家對電腦或多或少都應該有不少的了解吧 那么我們這些軟件 都是通過變成一個一個文件保存在電腦中 我們才可以…

【2023C卷最新題目】20天拿下華為OD筆試之【貪心】2023C-找座位/2023B-座位調整-全網注釋最詳細分類最全的華為OD真題題解

文章目錄 題目描述與示例題目描述輸入輸出說明示例一輸入輸出 示例二輸入輸出說明 解題思路代碼PythonJavaC時空復雜度 相同問題不同描述2023C-找座位題目描述輸入描述輸出描述示例一輸入輸出 示例二輸入輸出 華為OD算法/大廠面試高頻題算法練習沖刺訓練 題目描述與示例 題目描…

Spring Boot創建和使用(重要)

Spring的誕生是為了簡化Java程序開發的&#xff01; Spring Boot的誕生是為了簡化Spring程序開發的&#xff01; Spring Boot就是Spring框架的腳手架&#xff0c;為了快速開發Spring框架而誕生的&#xff01;&#xff01; Spring Boot的優點&#xff1a; 快速集成框架&#x…

2023年G2電站鍋爐司爐證考試題庫及G2電站鍋爐司爐試題解析

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2023年G2電站鍋爐司爐證考試題庫及G2電站鍋爐司爐試題解析是安全生產模擬考試一點通結合&#xff08;安監局&#xff09;特種作業人員操作證考試大綱和&#xff08;質檢局&#xff09;特種設備作業人員上崗證考試大綱…

MySQL 事務的底層原理和 MVCC(一)

在事務的實現機制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;預寫式日志&#xff09;機制來實現的。 在使用 WAL 的系統中&#xff0c;所有的修改都先被寫入到日志中&#xff0c;然后再被應用到系統中。通常包含 redo 和 undo 兩部分信息。 …