代碼訓練LeetCode(24)數組乘積

代碼訓練(24)LeetCode之數組乘積

Author: Once Day Date: 2025年6月5日

漫漫長路,才剛剛開始…

全系列文章可參考專欄: 十年代碼訓練_Once-Day的博客-CSDN博客

參考文章:

  • 238. 除自身以外數組的乘積 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球極客摯愛的技術成長平臺

文章目錄

      • 代碼訓練(24)LeetCode之數組乘積
        • 1. 原題
        • 2. 分析
        • 3. 代碼實現
        • 4. 總結

1. 原題

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

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

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

提示:

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

示例:

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

我們需要計算一個數組 answer,其中每個元素 answer[i] 是原數組 nums 中除了 nums[i] 之外所有元素的乘積。關鍵點是我們不能使用除法,并且需要在 O(n) 時間復雜度內解決,同時盡量減少額外空間的使用。

題目提供了一個數組 nums,要求我們為每一個元素計算出它所有其他元素的乘積。使用除法的話會非常直接,但題目要求我們不能使用除法,因此我們需要找到其他方法。由于每個元素的結果是其他元素的乘積,我們可以將問題分解為兩部分的乘積:當前元素左側的所有元素的乘積和右側所有元素的乘積。

解題思路

  1. 構建左積數組 L,其中 L[i] 表示 nums[i] 左側所有元素的乘積。
  2. 構建右積數組 R,其中 R[i] 表示 nums[i] 右側所有元素的乘積。
  3. 計算結果數組 answer,其中 answer[i] = L[i] * R[i]

分析步驟

構建左積數組

  • 初始化 L[0] = 1(因為第一個元素左邊沒有元素)。
  • 從左到右遍歷 nums,每個 L[i] = L[i - 1] * nums[i - 1]

構建右積數組

  • 初始化 R[n-1] = 1(因為最后一個元素右邊沒有元素)。
  • 從右到左遍歷 nums,每個 R[i] = R[i + 1] * nums[i + 1]

計算結果數組

  • answer[i] = L[i] * R[i]

舉例分析,以示例 nums = [1,2,3,4]

構建 L:

  • L[0] = 1
  • L[1] = 1 (L[0] * nums[0])
  • L[2] = 2 (L[1] * nums[1])
  • L[3] = 6 (L[2] * nums[2])

構建 R

  • R[3] = 1
  • R[2] = 4 (R[3] * nums[3])
  • R[1] = 12 (R[2] * nums[2])
  • R[0] = 24 (R[1] * nums[1])

結果 answer:

  • answer[0] = L[0] * R[0] = 1 * 24 = 24
  • answer[1] = L[1] * R[1] = 1 * 12 = 12
  • answer[2] = L[2] * R[2] = 2 * 4 = 8
  • answer[3] = L[3] * R[3] = 6 * 1 = 6

性能優化關鍵點

  • 時間復雜度:O(n)。我們只需要三次遍歷整個數組。
  • 空間復雜度:可以優化到 O(1)(不包括輸出數組)。我們可以直接在輸出數組上構建 L,然后用一個變量來跟蹤右邊元素的乘積。
3. 代碼實現
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int i;*returnSize = numsSize;int *returnArray = malloc(numsSize * sizeof(int));// Build the answer array as left product arrayreturnArray[0] = 1;for (i = 1; i < numsSize; i++) {returnArray[i] = returnArray[i - 1] * nums[i - 1];}// Modify the answer array by multiplying with right productsint right = 1;for (i = numsSize - 1; i >= 0; i--) {returnArray[i] = returnArray[i] * right;right *= nums[i];}return returnArray;
}
4. 總結

這道題測試了對數組操作和優化的理解。通過空間復雜度優化,我們學習了如何利用已有的資源(輸出數組和變量)減少空間需求。要提升編程能力,關鍵在于練習如何將問題分解成小的部分,并高效地解決它們。此外,學習如何通過一些小技巧(如變量跟蹤)在有限的資源下完成任務也是很重要的。

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

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

相關文章

NLP學習路線圖(十七):主題模型(LDA)

在浩瀚的文本海洋中航行&#xff0c;人類大腦天然具備發現主題的能力——翻閱幾份報紙&#xff0c;我們迅速辨別出"政治"、"體育"、"科技"等板塊&#xff1b;瀏覽社交媒體&#xff0c;我們下意識區分出美食分享、旅行見聞或科技測評。但機器如何…

vue對axios的封裝和使用

在 Vue 項目中&#xff0c;使用 axios 進行 HTTP 請求是非常常見的做法。為了提高代碼的可維護性、統一錯誤處理和請求攔截/響應攔截邏輯&#xff0c;對axios進行封裝使用。 一、基礎封裝&#xff08;適用于 Vue 2 / Vue 3&#xff09; 1. 安裝 axios npm install axios2. 創…

HTML實現端午節主題網站:龍舟爭渡,憑吊祭江誦君賦。

名人說:龍舟爭渡,助威吶喊,憑吊祭江誦君賦。——蘇軾《六幺令天中節》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、項目概覽:傳統與現代的技術碰撞1. 核心特性一覽2. 網站結構設計二、技術亮點深度解析1. 響應式布局的精妙設計2. CSS動畫系統的…

【Redis】筆記|第9節|Redis Stack擴展功能

Redis Stack 擴展功能筆記&#xff08;基于 Redis 7&#xff09; 一、Redis Stack 概述 定位&#xff1a;Redis OSS 擴展模塊&#xff08;JSON、搜索、布隆過濾器等&#xff09;&#xff0c;提供高級數據處理能力。核心模塊&#xff1a; RedisJSON&#xff1a;原生 JSON 支持…

如何選擇專業數據可視化開發工具?為您拆解捷碼全功能和落地指南!

分享大綱&#xff1a; 1、捷碼核心功能&#xff1a;4維能力支撐大屏開發 2、3步上手&#xff1a;可視化大屏開發操作路徑 3、適配場景&#xff1a;8大行業已驗證方案 在各行各業要求數字化轉型時代&#xff0c;數據可視化大屏已成為眾多企業數據驅動的核心工具。面對市場上繁雜…

測試W5500的第11步_使用ARP解析IP地址對應的MAC地址

本文介紹了基于W5500芯片的ARP協議實現方法&#xff0c;詳細闡述了ARP請求與回復的工作機制。ARP協議通過廣播請求和單播回復實現IP地址與MAC地址的映射&#xff0c;確保局域網設備間的可靠通信。文章提供了完整的STM32F10x開發環境下的代碼實現&#xff0c;包括網絡初始化、SP…

在樹莓派上添加音頻輸入設備的幾種方法

在樹莓派上添加音頻輸入設備可以通過以下步驟完成&#xff0c;具體方法取決于設備類型&#xff08;如USB麥克風、3.5mm接口麥克風或HDMI音頻輸入&#xff09;。以下是詳細指南&#xff1a; 1. 連接音頻輸入設備 USB麥克風/聲卡&#xff1a;直接插入樹莓派的USB接口。3.5mm麥克…

IDEA 打開文件亂碼

問題&#xff1a;文件亂碼 底部編碼無法切換 解決方案&#xff1a; 第一步 使用Nodepad 查詢文件編碼 本項目設置為 轉為 UTF-8 無 BOM 第二步&#xff1a;在 IntelliJ IDEA 中&#xff1a;右鍵點擊文件 → File Encoding → 選擇目標編碼&#xff08;如 UTF-8&#xff09; 最…

float、double 這類 浮點數 相比,DECIMAL 是另一種完全不同的數值類型

和 float、double 這類**“浮點數”**相比&#xff0c;DECIMAL 是另一種完全不同的數值類型&#xff0c;叫做&#xff1a; ? DECIMAL 是什么&#xff1f; DECIMAL 是“定點數”類型&#xff08;fixed-point&#xff09;&#xff0c;用于存儲精確的小數值&#xff0c;比如&…

Java應用10(客戶端與服務器通信)

Java客戶端與服務器通信 Java提供了多種方式來實現客戶端與服務器之間的通信&#xff0c;下面我將介紹幾種常見的方法&#xff1a; 1. 基于Socket的基本通信 服務器端代碼 import java.io.*; import java.net.*;public class SimpleServer {public static void main(String…

pytorch基本運算-范數

引言 前序學習進程中&#xff0c;已經對pytorch基本運算有了詳細探索&#xff0c;文章鏈接有&#xff1a; 基本運算 廣播失效 乘除法和冪運算 hadamard積、點積和矩陣乘法 上述計算都是以pytorch張量為運算元素&#xff0c;這些張量基本上也集中在一維向量和二維矩陣&#x…

EasyRTC音視頻實時通話助力新一代WebP2P視頻物聯網應用解決方案

一、方案背景? 物聯網技術深刻變革各行業&#xff0c;視頻物聯在智慧城市、工業監控等場景廣泛應用。傳統方案依賴中心服務器中轉&#xff0c;存在傳輸效率低、網絡負載大的問題。新一代WebP2P視頻物聯技術實現設備直連&#xff0c;降低網絡壓力并提升傳輸效率&#xff0c;成…

DAY 15 復習日

浙大疏錦行 數據使用爬蟲爬取weibo數據&#xff0c;下面是代碼 import datetime import os import csv import timeimport numpy as np import random import re import urllib.parse import requests from fake_useragent import UserAgentdef init():if not os.path.exists…

SSL/TLS 協議詳解:安全通信的基石

一、概述 SSL&#xff08;Secure Sockets Layer&#xff09; 及其繼任者 TLS&#xff08;Transport Layer Security&#xff09; 是位于 傳輸層&#xff08;TCP&#xff09;與應用層之間 的加密協議&#xff0c;用于在網絡通信中實現 機密性、身份認證和數據完整性。 核心目標…

使用子樹合并策略更新git項目的部分目錄

背景 正在開發的一個項目中引用了第三方庫的源碼&#xff0c;由于歷史原因&#xff0c;源碼的引用并不是很規范&#xff08;直接下載下來后作為自己項目的部分源碼使用&#xff0c;還進行了一些修改&#xff09;&#xff0c;具體如下&#xff1a; 我有一個本地git項目project…

pikachu通關教程-CSRF

CSRF(get) 用bp進行抓包 選擇action value值的修改 點擊test in browser copy然后放在bp代理的瀏覽器上&#xff0c;會出現一個提交按鈕&#xff0c;這時候點擊之后信息就被修改了。 CSRF(post) 請求的方式不同&#xff0c;其他都是一樣 CSRF Token 存在cookie 首先要先下載一…

AI驅動游戲開發:Unity與ML-Agents結合

AI驅動游戲開發&#xff1a;Unity與ML-Agents結合 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 AI驅動游戲開發&#xff1a;Unity與ML-Agents結合摘要引言技術架構與開發流程1. Unity與ML-Agents協同機制2. 開發…

如何給windos11 擴大C盤容量

動不動C盤就慢了&#xff0c;蘋果逼著用戶換手機&#xff0c;三天兩頭更新系統&#xff0c;微軟也是毫不手軟。c盤 從10個G就夠用&#xff0c;到100G 也不夠&#xff0c;看來通貨膨脹是部分行業的。 在 Windows 11 中擴大 C 盤容量&#xff0c;主要取決于磁盤分區布局和可用空…

Kafka入門-消費者

消費者 Kafka消費方式&#xff1a;采用pull&#xff08;拉&#xff09;的方式&#xff0c;消費者從broker中主動拉去數據。使用pull的好處就是消費者可以根據自身需求&#xff0c;進行拉取數據&#xff0c;但是壞處就是如果Kafka沒有數據&#xff0c;那么消費者可能會陷入循環…

SpringBoot自動化部署實戰技術文章大綱

技術背景與目標 介紹SpringBoot在現代開發中的重要性自動化部署的價值&#xff1a;提升效率、減少人為錯誤、實現CI/CD適用場景&#xff1a;中小型Web應用、微服務架構 自動化部署核心方案 基于Docker的容器化部署 SpringBoot應用打包為Docker鏡像使用Docker Compose編排多容…