力扣網C語言編程題:除自身以外數組的乘積

一. 簡介

本文記錄力扣網上涉及數組方面的編程題,主要以 C語言實現。

二.?力扣上C語言編程題:涉及數組

題目:除自身以外數組的乘積

給你一個整數數組?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
? ? 輸入 保證 數組 answer[i] 在? 32 位 整數范圍內

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

解題思路:

分析題目:分析題目的意思,第i個元素的值為其前面所有元素(即前綴元素)的乘積與 其后面的元素(即后綴元素)的乘積。

初步思路:

(1) 遍歷數組,得到每個元素的所有前綴元素的乘積;

(2) 再遍歷一遍數組,得到每個元素的所有后綴元素的乘積(從數組后往前計算);

(3) 最后再遍歷一次數組,將前面兩次遍歷獲取的前綴元素的乘積與后綴元素的乘積進行乘積計算,即可得到每個元素的值。

C語言實現如下:

#include <stdio.h>/*** Note: The returned array must be malloced, assume caller calls free().*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {if((nums == NULL) || (numsSize <= 0)) {return NULL;}int i = 0;int* prefix_ptr = (int*)malloc(numsSize * sizeof(int));int* suffix_ptr = (int*)malloc(numsSize * sizeof(int));int* ret_ptr = (int*)malloc(numsSize * sizeof(int));prefix_ptr[0] = 1;//計算第i個元素的所有前綴元素的乘積for(i = 1; i < numsSize; i++) {prefix_ptr[i] = prefix_ptr[i-1]* nums[i-1];}//計算第i個元素的所有后綴元素的乘積suffix_ptr[numsSize-1] = 1;for(i = 1; i < numsSize; i++) {suffix_ptr[numsSize-i-1] = suffix_ptr[numsSize-i] * nums[numsSize-i];}//將前面的前綴元素的乘積與 后綴元素的乘積進行乘積計算for(i = 0; i < numsSize; i++) {ret_ptr[i] = prefix_ptr[i] * suffix_ptr[i];} *returnSize = numsSize;free(prefix_ptr);prefix_ptr = NULL;free(suffix_ptr);suffix_ptr = NULL;return ret_ptr;  
}

可以看出,實現方法的時間復雜度為 O(n), 空間復雜度為 O(n)。滿足基本要求。

進階解題方法

上面基礎解題方法中,因為我們開辟了三個內存空間,(由于題目說返回空間不算)那么空間復雜度是 O(n)。根據題目最后進階要求,空間復雜度要控制在 O(1)。

接下來就要對上述代碼進行優化了,降低空間復雜度,也就是說只能開辟返回的buf,其他開辟空間的操作要優化掉。

解題思路:

1. 將上面三個緩存改為使用一個緩存,也就是只申請返回數據的緩存;

2. 將上面三個步驟在一次遍歷數組過程中完成;

具體實現方法:

1.?首先,申請一段numsSize大小的緩存,所有元素初始化為1(因為1與任何值的乘積都為任何值,不會產生任何影響);

2. 遍歷一次數組,求前綴元素乘積,后綴元素乘積,計算前綴元素乘積與后綴元素乘積的乘積,這三步同時完成;

計算第i個元素的 所有前綴元素的乘積,然后計算其所有后綴元素的乘積;將前綴乘積值計算乘積,再將后綴乘積值計算 乘積;

C語言實現如下:

#include <stdio.h>/*** Note: The returned array must be malloced, assume caller calls free().*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {if((nums == NULL) || (numsSize <= 0)) {return NULL;}int i = 0;int * ret_ptr = (int*)malloc(numsSize * sizeof(int));//首先將數組元素初始化為 1for(i = 0; i < numsSize; i++) {ret_ptr[i] = 1;}int prefix = 1;int suffix = 1;for(i = 1; i < numsSize; i++) {//計算第i個元素的所有前綴元素的乘積prefix *= nums[i-1];//計算第i個元素的所有后綴元素的乘積//注意:計算后綴元素乘積時需要從后往前計算suffix *= nums[numsSize-i];//每一輪循環將元素的前綴元素乘積計算ret_ptr[i] *= prefix;//每一輪循環將元素的后綴元素乘積計算ret_ptr[numsSize-i-1] *= suffix;}*returnSize = numsSize;return ret_ptr;
}

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

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

相關文章

SpringBoot擴展——發送郵件!

發送郵件 在日常工作和生活中經常會用到電子郵件。例如&#xff0c;當注冊一個新賬戶時&#xff0c;系統會自動給注冊郵箱發送一封激活郵件&#xff0c;通過郵件找回密碼&#xff0c;自動批量發送活動信息等。郵箱的使用基本包括這幾步&#xff1a;先打開瀏覽器并登錄郵箱&…

【html】iOS26 液態玻璃實現效果

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>液體玻璃效果演示</title><style>bo…

探索算法秘境:量子隨機游走算法及其在圖論問題中的創新應用

目錄 ?編輯 一、量子隨機游走算法的起源與原理 二、量子隨機游走算法在圖論問題中的創新應用 三、量子隨機游走算法的優勢與挑戰 四、結語 在算法研究的浩瀚星空中&#xff0c;總有一些領域如同遙遠星系&#xff0c;閃爍著神秘而誘人的光芒。今天&#xff0c;我們將一同深…

C# 一維數組和矩形數組全解析

在編程的世界里&#xff0c;數組是一種非常重要的數據結構。今天&#xff0c;我們就來詳細了解一下一維數組和矩形數組。 數組基礎認知 數組實例是從 System.Array 繼承類型的對象。由于它從 BCL 基類派生而來&#xff0c;所以繼承了許多有用的成員&#xff1a; Rank 屬性&a…

WebStorm編輯器側邊欄

目錄 編輯器側邊欄行號配置行號隱藏行號 代碼折疊側邊欄圖標書簽添加匿名書簽添加助記符書簽 運行和調試管理斷點配置斷點圖標 版本控制配置Git Blame注釋 編輯器側邊欄 編輯器左側的垂直區域。當編寫代碼時&#xff0c;提供重要信息和操作圖標。外觀和行為可以根據你的喜好進…

騰訊云TCCA認證考試報名 - TDSQL數據庫交付運維工程師(PostgreSQL版)

數據庫交付運維工程師-騰訊云TDSQL(PostgreSQL版)認證 適合人群&#xff1a; 適合從事TDSQL(PostgreSQL版)交付、運維、售前咨詢以及TDSQL(PostgreSQL版)相關項目的管理人員。 認證考試 單選*40道多選*20道 成績查詢 70分及以上通過認證&#xff0c;官網個人中心->認證考…

attn_mask 為 (1, 1) 時什么意思? 7,7又是什么意思?

在深度學習中&#xff0c;特別是在 Transformer 模型和注意力機制&#xff08;Attention Mechanism&#xff09;中&#xff0c;attn_mask&#xff08;注意力掩碼&#xff09;是一個用于控制注意力計算的張量。它決定了在計算注意力分數時&#xff0c;哪些位置應該被關注&#x…

Qt聯合Halcon開發二:Halcon窗口綁定Qt控件顯示Hobject圖像【詳細圖解流程】

1. 項目準備 在本項目中&#xff0c;我們將使用Qt框架與Halcon庫結合&#xff0c;展示圖像并進行圖像處理。首先&#xff0c;確保你已經配置好Qt和Halcon的開發環境。 環境配置可查看上篇文章 2. 創建Qt界面 在Qt中&#xff0c;創建一個窗口并拖入按鈕和Graphics View控件。G…

Redis 持久化機制詳解:RDB、AOF 原理與面試最佳實踐(AOF篇)

在上一章我們深入學習了 Redis 中重要的數據持久化機制 ——RDB&#xff08;Redis Database&#xff09;&#xff0c;了解了其通過周期性快照將數據以二進制文件形式保存到磁盤的原理&#xff0c;包括觸發條件、文件結構以及優缺點等核心內容。 Redis 持久化機制詳解&#xff…

【GateWay】和權限驗證

【GateWay】網關詳解和權限驗證 一、Gateway 核心概念與架構二、路由斷言&#xff08;Route Predicates&#xff09;詳解三、過濾器&#xff08;Filters&#xff09;機制四、權限認證的核心理論模型五、Spring Cloud Gateway Security OAuth2 集成方案六、OAuth2.0 集成 一、…

QSqlDatabase: QSQLITE driver not loaded

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言可能的原因解決辦法1. 確認 SQLite 驅動插件文件2. 拷貝插件文件到應用程序目錄3. 設置插件搜索路徑4. 安裝 SQLite 依賴庫5. 解決 QCoreApplication 實例問題 …

20250619在榮品的PRO-RK3566開發板的Android13下解決海羅光電有限公司HL070T58C-05屏在啟動的時候出現白色條紋的問題【時序】

20250619在榮品的PRO-RK3566開發板的Android13下解決海羅光電有限公司HL070T58C-05屏在啟動的時候出現白色條紋的問題 2025/6/19 20:39 緣起&#xff1a;榮品的PRO-RK3566開發板的Android13下&#xff0c;點亮海羅光電有限公司HL070T58C-05屏。 在啟動的時候會出現花屏/白色條紋…

docker使用Volume對Nginx進行掛載

需求&#xff1a; 需要將Nginx的歡迎頁面也就是index.html文件進行修改。 原始方法&#xff1a;由于docker會為每一個容器創建其對應的文件信息&#xff0c;但是創建的信息內容只有其最基礎的運行信息&#xff0c;所以想要直接去訪問其index.html就無法做到。 使用volume&am…

基于springboot的寵物服務預約系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

idea 2025會在用戶目錄創建IdeaSnapshots文件夾

推薦一個api管理測試工具 一個簡單的API測試和編寫文檔的工具 idea 2025會在用戶目錄創建IdeaSnapshots文件夾 解決方案 打開 Profiler 點擊 setting 參考 https://youtrack.jetbrains.com/articles/SUPPORT-A-1086/How-to-change-or-turn-off-the-IdeaSnapshots-folder-…

【Mini-F5265-OB開發板試用測評】2、PWM驅動遙控車RX2接收解碼帶馬達驅動控制IC

手頭有帶轉向電機和動力電機小車底盤&#xff0c;買了很久一直在吃灰。 最近查了一下小車的驅動IC是富滿微的8D420L,是一款傳統的RX2接收解碼芯片&#xff0c;帶馬達驅動。 手頭沒有TX2發送芯片&#xff0c;所以考慮用MCU直接發送PWM直接接入RX2&#xff0c;可能可以驅動。 一…

Tcpdump網絡抓包工具詳解!

一、簡介 tcpdump就是&#xff1a;dump the traffic on a network&#xff0c;根據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump是一個用于截取網絡分組&#xff0c;并輸出分組內容的工具。憑借強大的功能和靈活的截取策略&#xff0c;使其成為類UNIX系統下用…

Spring Boot的Security安全控制——應用SpringSecurity!

應用Spring Security 前面介紹了在項目開發時為什么選擇Spring Security&#xff0c;還介紹了它的原理。本節開始動手實踐Spring Security的相關技術。 實戰&#xff1a;Spring Security入門 現在開始搭建一個新項目&#xff0c;實踐一個Spring Security的入門程序。 &…

FPGA基礎 -- Verilog行為級建模之alawys語句

Verilog 中的 always 語句塊&#xff0c;這是行為級建模的核心結構之一&#xff0c;在 RTL 級設計中廣泛用于時序邏輯和組合邏輯的建模。 一、什么是 always 語句&#xff1f; ? 定義&#xff1a; always 語句用于描述可綜合的硬件行為邏輯&#xff0c;表示一個**“事件驅動…

【力扣 簡單 C】704. 二分查找

目錄 題目 解法一&#xff1a;二分查找 題目 解法一&#xff1a;二分查找 int find(const int* nums, int size, int target) {int left 0, right size - 1;while (left < right){int mid (left right) / 2;if (nums[mid] < target)left left 1;else if (nums[m…