力扣網C語言編程題:三數之和

一. 簡介

本文記錄力扣網上的邏輯編程題,涉及數組方面的,這里記錄一下 C語言實現和Python實現。

二.?力扣網C語言編程題:三數之和

題目:三數之和

給你一個整數數組 nums ,判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i != j、i != k 且 j != k ,同時還滿足 nums[i] + nums[j] + nums[k] == 0 。請你返回所有和為 0 且不重復的三元組。
注意:答案中不可以包含重復的三元組。

示例 1:
輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]
解釋:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元組是 [-1,0,1] 和 [-1,-1,2] 。
注意,輸出的順序和三元組的順序并不重要。

示例 2:
輸入:nums = [0,1,1]
輸出:[]
解釋:唯一可能的三元組和不為 0 。

示例 3:
輸入:nums = [0,0,0]
輸出:[[0,0,0]]
解釋:唯一可能的三元組和為 0 。

提示:
? ? 3 <= nums.length <= 3000
? ? -105 <= nums[i] <= 105

解題思路:

根據題目要求,數組中找到三個元素之和為0,且不重復的三元組。這里解決不重復的方法就是排序,排序后查重就可以保證不重復。

固定一個元素,使用雙指針,從數組的頭部與尾部進行同時進行查找,查找第二元素和第三個元素。

具體方法:

1. 從小到大進行排序;

2. 遍歷數組,元素去重;

3. 開始從數組首部和尾部開始同時進行,統計三個元素為 0的元素,如果和小于0,則移動左指針。如果大于0則移動右指針。如果等于0則保存數據,然后對左邊指針的元素進行查重,右邊指針的元素進行查重;

C語言實現如下:

#include <stdio.h>//從小到大排序
int compare_data(const void* a, const void* b) {return *(int*)a -*(int*)b;
}/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {if((nums == NULL) || (numsSize <= 0) || (returnSize == NULL) || (returnColumnSizes == NULL)) {return NULL;}*returnSize = 0;int left = 0;int right = 0;int i = 0; //分配返回數組的緩存int** ret_data = (int**)malloc(10*numsSize * sizeof(int*));*returnColumnSizes = (int*)malloc(10*numsSize * sizeof(int));//從小到大排序qsort(nums, numsSize, sizeof(int), compare_data);//遍歷數組(從頭部和尾部同時)for(i = 0; i < (numsSize-2); i++) {//當前元素大于0,那么更不可能存在sum值等于0的數了,結束遍歷if(nums[i] > 0) {break;}//元素去重(當前元素與上一次元素相等,跳過此次計算)if(i > 0 && nums[i] == nums[i-1]) {continue;}left = i+1;right = numsSize-1;//開始查找三數之和while(left < right) {//判斷和的值int sum = nums[i] + nums[left] + nums[right];if(sum == 0) { //分配內存,保存結果ret_data[*returnSize] = (int*)malloc(3 * sizeof(int));ret_data[*returnSize][0] = nums[i];ret_data[*returnSize][1] = nums[left];ret_data[*returnSize][2] = nums[right];(*returnColumnSizes)[*returnSize] = 3; //返回數組當前行的列數為3(*returnSize)++; //三元組的個數//左邊指針的元素進行查重while((left < right) && (nums[left] == nums[++left]));//右邊指針的元素進行查重while((left < right) && (nums[right] == nums[--right]));}else if(sum < 0) { //左指針向右移找大值left++;}else { //右指針向左移找小值right--;}  }}return ret_data;
}

Python實現如下:


class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:ret = []n = len(nums)#從小到大進行排序,方便去重nums.sort()#遍歷數組元素(從數組的首部和尾部同時進行)#0 ~ n-3for i in range(0, n-2):#如果第一個元素大于0,則不必查找了(后面元素更大)if(nums[i] > 0):break#元素查重(如果當前元素與上一次元素相等,則跳過這次計算)if(i > 0 and nums[i] == nums[i-1]):continueleft = i + 1right = n - 1#查找和為0的三元組while(left < right):sum = nums[i] + nums[left] + nums[right] #和 == 0if(sum == 0):ret.append([nums[i], nums[left], nums[right]])#左右指針的元素查重while(left < right and nums[left] == nums[left+1]):left += 1while(left < right and nums[right] == nums[right-1]):right -= 1left += 1right -= 1#和 < 0,則左指針向右移(說明和小了,需要和增大)elif(sum < 0): left += 1#和 > 0,則右指針向左移(說明和大了,需要和減小)else:right -= 1return ret

第一次寫 Python,是與 C語言有區別。好像寫起來也沒想象中困難,加油!

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

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

相關文章

2.2 Windows MSYS2編譯FFmpeg 4.4.1

一、安裝編譯工具 # 更換pacman源 sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist* pacman -Sy# 安裝依賴 pacman -S --needed base-devel mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-ya…

驅動開發,隊列,環形緩沖區:以GD32 CAN 消息處理為例

對環形緩沖區進行進一步的優化和功能擴展&#xff0c;以應對更復雜的實際應用場景&#xff0c;特別是針對 CAN 總線消息處理的場景。 一、優化點 1&#xff1a;動態配置環形緩沖區大小在原始實現中&#xff0c;我們固定了緩沖區大小為 RINGBUFF_LEN 64。這種方式雖然簡單&am…

SQL基礎知識,MySQL學習(長期更新)

1、基本操作&#xff0c;增刪查改 INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...); DELETE FROM 表名 WHERE 條件 SELECT * FROM 表名 WHERE 條件 UPDATE 表名 SET 字段1 值, 字段2 值, ... WHERE 條件; SELECT * INTO 新表 FROM 舊表 WHERE… INSERT INTO 語…

Git(一):初識Git

文章目錄 Git(一)&#xff1a;初識GitGit簡介核心功能分布式特性結構與操作優勢與適用場景 創建本地倉庫git init配置name與email--global 工作區、暫存區與版本庫git addgit commitcommit后.git的變化 Git(一)&#xff1a;初識Git Git簡介 Git 是一個分布式版本控制系統&…

第19天:初級數據庫學習筆記3

分組函數&#xff08;多行處理函數&#xff09; 即多個輸入對應一個輸出。前面講的數據處理函數是單行處理函數。&#xff08;在公司中常說單&#xff0c;多行處理函數&#xff09; 分組函數包括五個&#xff1a; max&#xff1a;最大值min&#xff1a;最小值avg&#xff1a…

Windows11下搭建Raspberry Pi Pico編譯環境

1. 系統與工具要求 PC平臺&#xff1a; Windows 11 專業版 Windows GCC: gcc-15.1.0-64.exe GNU Make: 4.3 Git: 2.49.0 cmake: 4.0.2 python:3.12.11 Arm GNU Toolchain Downloads – Arm Developer 2. 工具安裝與驗證 2.1 工具安裝 winget安裝依賴工具&#xff08;Windows …

【C語言極簡自學筆記】重講運算符

一、算術操作符 算術操作符描述把兩個操作數相加-第一個操作數減去第二個操作數*把兩個操作數相乘/分子除以分母%取模運算符&#xff0c;整除后的余數 注意&#xff1a;1.除號的兩端都是整數的時候執行的是整數的除法&#xff0c;兩端只要有一個浮點數&#xff0c;就執行浮點…

持續集成 CI/CD-Jenkins持續集成GitLab項目打包docker鏡像推送k8s集群并部署至rancher

Jenkins持續集成GitLab項目 GitLab提交分支后觸發Jenkis任務 之前是通過jar包在shell服務器上進行手動部署&#xff0c;麻煩且耗時。現通過Jenkins進行持續集成實現CI/CD。以test分支為例 提交即部署。 由于是根據自己實際使用過程 具體使用到了 gitlabjenkinsdockerharborra…

Apache Iceberg與Hive集成:非分區表篇

引言 在大數據處理領域&#xff0c;Apache Iceberg憑借其先進的表格式設計&#xff0c;為大規模數據分析帶來了新的可能。當Iceberg與Hive集成時&#xff0c;這種強強聯合為數據管理與分析流程提供了更高的靈活性和效率。本文將聚焦于Iceberg與Hive集成中的非分區表場景&#…

webpack 如何區分開發環境和生產環境

第一種方法: 方法出處&#xff1a;命令行接口&#xff08;CLI&#xff09; | webpack 中文文檔 1.利用webpack.config.js 返回的是個函數&#xff0c;利用函數的參數&#xff0c;來區分環境 具體步驟 1&#xff09; package.json文件&#xff1a;在npm scripts 命令后面追加 …

React組件通信——context(提供者/消費者)

Context 是 React 提供的一種組件間通信方式&#xff0c;主要用于解決跨層級組件 props 傳遞的問題。它允許數據在組件樹中"跨級"傳遞&#xff0c;無需顯式地通過每一層 props 向下傳遞。 一、Context 核心概念 1. 基本組成 React.createContext&#xff1a;創建 C…

“微信短劇小程序開發指南:從架構設計到上線“

1. 引言&#xff1a;短劇市場的機遇與挑戰 近年來&#xff0c;短視頻和微短劇市場呈現爆發式增長&#xff0c;用戶碎片化娛樂需求激增。短劇小程序憑借輕量化、社交傳播快、變現能力強等特點&#xff0c;成為內容創業的新風口。然而&#xff0c;開發一個穩定、流暢且具備商業價…

RPC與RESTful對比:兩種API設計風格的核心差異與實踐選擇

# RPC與RESTful對比&#xff1a;兩種API設計風格的核心差異與實踐選擇 ## 一、架構哲學與設計目標差異 1. **RPC&#xff08;Remote Procedure Call&#xff09;** - **核心思想**&#xff1a;將遠程服務調用偽裝成本地方法調用&#xff08;方法導向&#xff09; - 典型行為…

【pytest進階】pytest之鉤子函數

什么是 hook (鉤子)函數 經常會聽到鉤子函數(hook function)這個概念,最近在看目標檢測開源框架mmdetection,里面也出現大量Hook的編程方式,那到底什么是hook?hook的作用是什么? what is hook ?鉤子hook,顧名思義,可以理解是一個掛鉤,作用是有需要的時候掛一個東西…

深度學習計算——動手學深度學習5

環境&#xff1a;PyCharm python3.8 1. 層和塊 塊&#xff08;block&#xff09;可以描述 單個層、由多個層組成的組件或整個模型本身。 使用塊進行抽象的好處&#xff1a; 可將塊組合成更大的組件(這一過程通常是遞歸) 如 圖5.1.1所示。通過定義代碼來按需生成任意復雜度…

NodeJS的fs模塊的readFile和createReadStream區別以及常見方法

Node.js 本身沒有像 Java 那樣嚴格區分字符流和字節流&#xff0c;區別主要靠編碼&#xff08;encoding&#xff09;來控制數據是以 Buffer&#xff08;二進制字節&#xff09;形式還是字符串&#xff08;字符&#xff09;形式處理。 詳細解釋&#xff1a; 方面JavaNode.js字節…

基于二進制XOR運算的機器人運動軌跡與對稱圖像自動生成算法

原創&#xff1a;項道德&#xff08;daode3056,daode1212&#xff09; 新的算法出現&#xff0c;往往能給某些行業與產業帶來革命與突破。為探索機器人運動軌跡與對稱圖像自動生成算法&#xff0c;本人已經通過18種算法的測試&#xff0c;最終&#xff0c;以二進制的XOR運算為…

Spring AI 項目實戰(七):Spring Boot + Spring AI Tools + DeepSeek 智能工具平臺(附完整源碼)

系列文章 序號文章名稱1Spring AI 項目實戰(一):Spring AI 核心模塊入門2Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼)3Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼)4Spring AI 項目實戰(四…

spring-webmvc @RequestHeader 典型用法

典型用法 基礎用法&#xff1a;獲取指定請求頭值 GetMapping("/info") public String getInfo(RequestHeader("User-Agent") String userAgent) {return "User-Agent: " userAgent; }如果請求中包含 User-Agent 請求頭&#xff0c;則其值將被…

Ubuntu:20.04中安裝docker

是的&#xff0c;您列出的命令是完整的安裝步驟&#xff0c;但為了確保100%可靠性和處理可能的問題&#xff0c;我建議進行以下優化和補充&#xff1a; 完整優化的安裝腳本&#xff08;包含錯誤處理和驗證&#xff09; #!/bin/bash# 1. 徹底清理舊版本和配置 sudo apt remove…