C語言編程--15.四數之和

題目:

給你一個由 n 個整數組成的數組 nums ,和一個目標值 target 。請你找出并返回滿足下述全部條件且不重復的四元組 [nums[a], nums[b], nums[c], nums[d]] (若兩個四元組元素一一對應,則認為兩個四元組重復):

  1. 0 <= a, b, c, d < n
  2. a、b、c 和 d 互不相同
  3. nums[a] + nums[b] + nums[c] + nums[d] == target
    你可以按 任意順序 返回答案 。

示例 1:
輸入:nums = [1,0,-1,0,-2,2], target = 0
輸出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:
輸入:nums = [2,2,2,2,2], target = 8
輸出:[[2,2,2,2]]

提示:

1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109

代碼:

#include <stdlib.h>// 比較函數,用于 qsort 對數組進行排序
// pa 和 pb 是指向要比較元素的指針
// 返回值為 1 表示 a > b,返回 -1 表示 a < b
int cmp(const void* pa, const void* pb)
{int a = *(int*)pa;  // 將 pa 指針指向的元素轉換為 int 類型并賦值給 aint b = *(int*)pb;  // 將 pb 指針指向的元素轉換為 int 類型并賦值給 breturn a > b ? 1 : -1;  // 如果 a 大于 b 返回 1,否則返回 -1
}// 四數之和函數,用于找出數組中所有不重復的四元組,使得它們的和等于目標值
// nums 是輸入的整數數組
// numsSize 是數組的長度
// target 是目標和
// returnSize 是返回的四元組的數量
// returnColumnSizes 是每個四元組的長度(固定為 4)
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) {qsort(nums, numsSize, sizeof(int), cmp);  // 對數組進行排序,方便后續去重和雙指針操作int base = 100;  // 初始分配的結果數組的容量int **result = (int**)malloc(sizeof(int*) * base);  // 動態分配存儲四元組的二維數組*returnColumnSizes = (int*)malloc(sizeof(int) * base);  // 動態分配存儲每個四元組長度的數組*returnSize = 0;  // 初始化返回的四元組數量為 0// 如果數組長度小于 4,直接返回空結果if (numsSize < 4) {return result;}// 外層循環,固定第一個數for(int i = 0; i < numsSize - 3; i++) {// 跳過重復的第一個數,避免結果中出現重復的四元組if (i > 0 && nums[i] == nums[i - 1])continue;// 第二層循環,固定第二個數for(int j = i + 1; j < numsSize - 2; j++) {// 跳過重復的第二個數,避免結果中出現重復的四元組if (j > i + 1 && nums[j] == nums[j - 1])continue;int l = j + 1;  // 左指針,指向第二個數的下一個位置int r = numsSize - 1;  // 右指針,指向數組的最后一個位置// 雙指針法,在剩余的元素中尋找滿足條件的第三個數和第四個數while (l < r) {// 計算四個數的和,使用 long long 類型避免整數溢出long long sum = (long long)nums[i] + (long long)nums[j] + (long long)nums[l] + (long long)nums[r];long long temp = sum - target;  // 計算當前和與目標值的差值// 如果差值為 0,說明找到了一個滿足條件的四元組if (temp == 0) {result[*returnSize] = (int*)malloc(sizeof(int) * 4);  // 為新的四元組分配內存(*returnColumnSizes)[*returnSize] = 4;  // 設置該四元組的長度為 4result[*returnSize][0] = nums[i];  // 存儲第一個數result[*returnSize][1] = nums[j];  // 存儲第二個數result[*returnSize][2] = nums[l];  // 存儲第三個數result[*returnSize][3] = nums[r];  // 存儲第四個數(*returnSize)++;  // 四元組數量加 1// 如果結果數組的容量不夠,擴大容量if (*returnSize == base) {base *= 2;  // 容量翻倍result = (int**)realloc(result, sizeof(int*) * base);  // 重新分配結果數組的內存*returnColumnSizes = (int*)realloc(*returnColumnSizes, sizeof(int) * base);  // 重新分配每個四元組長度數組的內存}int a = nums[l];  // 記錄當前左指針指向的數int b = nums[r];  // 記錄當前右指針指向的數// 跳過重復的第三個數while (nums[l] == a && l < r)l++;// 跳過重復的第四個數while (nums[r] == b && l < r)r--;} // 如果當前和大于目標值,右指針左移else if (temp > 0) {r--;} // 如果當前和小于目標值,左指針右移else {l++;}   }}}return result;  // 返回存儲所有滿足條件四元組的二維數組
}

代碼分析:

優點

  1. 排序和雙指針法:通過對數組進行排序,然后使用雙指針法,將原本的暴力枚舉 O(n4)的時間復雜度降低到了O(n3),提高了算法的效率。
  2. 去重處理:在每一層循環中都進行了去重處理,避免了結果中出現重復的四元組,保證了結果的正確性。
  3. 動態內存分配:使用 malloc 和 realloc 動態分配內存,根據實際結果的數量調整內存大小,避免了內存的浪費。
  4. 處理整數溢出:在計算四個數的和時,使用 long long 類型,避免了整數溢出的問題,提高了代碼的健壯性。

缺點

  1. 時間復雜度較高:雖然使用了雙指針法將時間復雜度從 O(n4)的時間復雜度降低到了O(n3),但對于大規模數據,仍然可能會超時。
  2. 內存管理復雜:使用了動態內存分配,需要手動管理內存,容易出現內存泄漏的問題。在使用完返回的結果數組后,需要調用者手動釋放內存。
  3. 提前剪枝不足:代碼中雖然有一些基本的邏輯,但沒有充分利用排序后的數組特性進行更有效的提前剪枝,例如可以在某些情況下提前終止循環,減少不必要的計算。

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

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

相關文章

2025.04.23【探索工具】| STEMNET:高效數據排序與可視化的新利器

文章目錄 1. STEMNET工具簡介2. STEMNET的安裝方法3. STEMNET常用命令 1. STEMNET工具簡介 在生物信息學領域&#xff0c;分析和處理大規模數據集是研究者們面臨的日常挑戰。STEMNET工具應運而生&#xff0c;旨在提供一個強大的平臺&#xff0c;用于探索和分析單細胞RNA測序&a…

Day-3 應急響應實戰

應急響應實戰一&#xff1a;Web入侵與數據泄露分析 1. Web入侵核心原理 ??漏洞利用路徑?? 未授權訪問&#xff1a;弱口令&#xff08;如空密碼/默認口令&#xff09;、目錄遍歷漏洞代碼注入攻擊&#xff1a;JSP/ASP木馬、PHP一句話木馬&#xff08;利用eval($_POST[cmd])&…

兩段文本比對,高亮出差異部分

用法一:computed <div class"card" v-if"showFlag"><div class"info">*紅色背景為已刪除內容&#xff0c;綠色背景為新增內容</div><el-form-item label"與上季度比對&#xff1a;"><div class"comp…

Python中的 for 與 迭代器

文章目錄 一、for 循環的底層機制示例&#xff1a;手動模擬 for 循環 二、可迭代對象 vs 迭代器關鍵區別&#xff1a; 三、for 循環的典型應用場景1. 遍歷序列類型2. 遍歷字典3. 結合 range() 生成數字序列4. 遍歷文件內容 四、迭代器的自定義實現示例&#xff1a;生成斐波那契…

Pytest教程:為什么Pytest要用插件模式?

目錄 一、歷史背景:測試框架的局限性與Pytest的設計哲學 1.1 早期測試框架的困境 1.2 Pytest的模塊化設計 二、橫向對比:插件機制如何讓Pytest脫穎而出 2.1 與Unittest/Nose的對比 2.2 插件模式的架構優勢 三、插件模式的核心優勢解析 3.1 可擴展性:從單元測試到全鏈…

【深度】如何通過MCP實現多智能體之間的協同

來源&#xff1a;騰訊技術工程、infoQ、原力注入 自 OpenAI 于 2023 年發布函數調用功能以來&#xff0c;我一直在思考如何構建一個開放的智能體與工具使用生態系統。隨著基礎模型愈發智能化&#xff0c;智能體與外部工具、數據和 API 的交互能力卻日益碎片化&#xff1a;開發…

NVIDIA自動駕駛安全與技術讀后感

ll在閱讀了 NVIDIA 自動駕駛安全報告后&#xff0c;我對該公司致力于推進自動駕駛汽車&#xff08;AV&#xff09;技術、同時優先考慮安全和標準化的承諾印象深刻。它揭示了 NVIDIA 在功能安全、法規合規性以及與全球標準組織合作方面的嚴謹態度。 ?? 報告中最引人注目的部分…

關于nginx,負載均衡是什么?它能給我們的業務帶來什么?怎么去配置它?

User 關于nginx&#xff0c;我還想知道&#xff0c;負載均衡是什么&#xff1f;它能為我的業務帶來什么&#xff1f;怎么去配置它&#xff1f; Assistant 負載均衡是 Nginx 另一個非常強大的功能&#xff0c;也是構建高可用、高性能應用的關鍵技術之一。我們來詳細了解一下。 …

前端如何優雅地對接后端

作為一名前端開發者&#xff0c;與后端對接是我們日常工作中不可避免的一部分。從API設計的理解到錯誤處理的優雅實現&#xff0c;前端需要的不只是調用接口的代碼&#xff0c;更是一種協作的藝術。本文將從Vue 3項目出發&#xff0c;分享如何與后端高效協作&#xff0c;減少聯…

PYTHON用幾何布朗運動模型和蒙特卡羅MONTE CARLO隨機過程模擬股票價格可視化分析耐克NKE股價時間序列數據

原文鏈接&#xff1a;http://tecdat.cn/?p27099 金融資產/證券已使用多種技術進行建模。該項目的主要目標是使用幾何布朗運動模型和蒙特卡羅模擬來模擬股票價格。該模型基于受乘性噪聲影響的隨機&#xff08;與確定性相反&#xff09;變量&#xff08;點擊文末“閱讀原文”獲取…

頭歌之動手學人工智能-機器學習 --- PCA

目錄 第1關&#xff1a;維數災難與降維 第2關&#xff1a;PCA算法流程 任務描述 編程要求 測試說明 第3關&#xff1a;sklearn中的PCA 任務描述 編程要求 測試說明 第1關&#xff1a;維數災難與降維 第2關&#xff1a;PCA算法流程 任務描述 本關任務&#xff1a;補充…

IOMUXC_SetPinMux的0,1參數解釋

IOMUXC_SetPinMux(IOMUXC_ENET1_RX_DATA0_FLEXCAN1_TX, 0); 這里的第二個參數 0 實際上傳遞給了 inputOnfield&#xff0c;它控制的是 SION&#xff08;Software Input On&#xff09;位。 當 inputOnfield 為 0 時&#xff0c;SION 關閉&#xff0c;此時引腳的輸入/輸出方向由…

express響應設置 以及redirect,download,json.sendFdile

Express 中常用響應方法 的整理&#xff0c;包括設置響應頭、重定向、下載、發送 JSON、發送文件等&#x1f447; &#x1f4e4; 一、設置響應頭與狀態碼 設置狀態碼 res.status(404).send(Not Found);設置響應頭 res.set(Content-Type, text/plain); // 設置內容類型 res.s…

深度學習-數值穩定性和模型初始化

到目前為止&#xff0c;我們實現的每個模型都是根據某個預先制定的分布來初始化模型的參數&#xff0c;有人會認為初始化方案時理所當然的&#xff0c;忽略了如何做出這些選擇的細節&#xff0c;甚至有人可能會覺得&#xff0c;初始化方案的選擇并不是特別重要&#xff0c;實際…

SFINAE(Substitution Failure Is Not An Error)

C 中的 SFINAE&#xff08;替換失敗并非錯誤&#xff09; SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;是 C 模板元編程的核心機制之一&#xff0c;允許在編譯時根據類型特性選擇不同的模板實現。以下通過代碼示例和底層原理&#xff0c;逐步解析 SFI…

【Python筆記 04】輸入函數、轉義字符

一、Input 輸入函數 prompt是提示&#xff0c;會在控制臺顯示&#xff0c;用作提示函數。 name input("請輸入您的姓名&#xff1a;") print (name)提示你輸入任意信息&#xff1a; 輸入input test后回車&#xff0c;他輸出input test 二、常用的轉義字符 只講…

什么是量子計算?它能做什么?

拋一枚硬幣。要么正面朝上&#xff0c;要么反面朝上&#xff0c;對吧&#xff1f;當然&#xff0c;那是在我們看到硬幣落地的結果之后。但當硬幣還在空中旋轉時&#xff0c;它既不是正面也不是反面&#xff0c;而是正面和反面都有一定的可能性。 這個灰色地帶就是量子計算的簡…

入門 Go 語言

本專欄的 Go 語言學習參考了B站UP 軟件工藝師的視頻 本節需要&#xff1a; Go 語言環境VSCode 安裝環境 下載 Go 環境&#xff0c;并安裝下載 VSCode&#xff0c;安裝。在 VSCode 中安裝 Go 擴展&#xff1a; 接下來就可以編寫 Go 語言了 第一條 Go Go 語言是一種編譯型…

Oracle EBS R12.2 漢化

一、前言 在使用oracle ebs時&#xff0c;使用中文會更好的理解整個ebs流程&#xff0c;以下介紹oracle r12中文補丁的方式 如果你的系統除了支持英語外&#xff0c;還支持其他語言&#xff0c;比如中文&#xff0c;那你在下載補丁的時候除了下載Generic Platform版本外&#…

參考文獻新國標GB/T 7714-2025的 biblatex 實現

參考文獻新國標GB/T 7714-2025的biblatex實現 新版 GB/T 7714 目前正在修訂和征求意見&#xff08;https://std.samr.gov.cn/gb/search/gbDetailed?id14CA9D282EB75AC8E06397BE0A0AEA2E&#xff09;。 根據已經呈現的草案&#xff0c;初步實現了biblatex樣式(詳見biblatex-gb…