LeetCode (力扣) 18. 4Sum (C) - Medium (双指针法、搜寻法)

【R语言实例】物种分布模型介绍 SDM介绍 阅读详情

同步发于 JuzerTech 网站,里面有我软、硬件学习的纪录与科技产品开箱,欢迎进去观看。

本题为 3Sum 、 3Sum Closest 的延伸题目,可以先看前面的题目再来看这题,会比较有连贯性。

本题题目为,给定一串数字,输出任意4个数字相加,等于目标值的所有组合。

 

题目与范例如下

Given an array nums of n integers, return an array of all the unique quadruplets [nums[a], nums[b], nums[c], nums[d]] such that:

0 <= a, b, c, d < n
a, b, c, and d are distinct.
nums[a] + nums[b] + nums[c] + nums[d] == target
You may return the answer in any order.


解题策略分为两总,( 1 ) 双指针法,( 2 )搜寻法。

( 1 ) 双指针法为,先排序整个数字阵列,再透过两层回圈遍历数字,每次透过双指针找出符合条件的值。

( 2 ) 搜寻法为,先排序整个数字阵列,再透过三层回圈遍历数字,每次透过二元搜寻找到符合的值。

 

下方为我的代码

( 1 ) 双指针法

/**
 * 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 cmp(const void* a, const void* b){
	return *(int*)a - *(int*)b;
}

int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes){

    *returnSize = 0;            // number of return pairs
    int left,right;
    int step = 4;              // each memory alloc
    *returnColumnSizes = (int*)malloc(sizeof(int*)*step); 
    int** re = (int**)malloc(sizeof(int*)*step);
	
    qsort(nums, numsSize, sizeof(int), cmp);

    for(int i = 0; i<numsSize-3 ; i++){
        if(i!=0){                               //Jump Same num
            while(i<numsSize-3){
                if(nums[i]==nums[i-1])
                    i++;
                else
                    break;
            }
        }
        if(i<numsSize-3){
            for(int j = i+1; j<numsSize-2 ; j++ ){
                if(j!=i+1){                               //Jump Same num
                    while(j<numsSize-2){
                        if(nums[j]==nums[j-1])
                            j++;
                        else
                            break;
                    }
                }
	        if(j<numsSize-2){
		    left = j+1;
		    right = numsSize-1;
		    while(right>left){
			if((nums[i]+nums[j]+nums[left]+nums[right])==target){
			    if((*returnSize) != 0 && (*returnSize)%step == 0){
			        *returnColumnSizes = (int*)realloc(*returnColumnSizes, sizeof(int*) * ((*returnSize)+step));
			        re = (int**)realloc(re, sizeof(int*) * ((*returnSize)+step));
			    }
			    (*returnColumnSizes)[*returnSize] = 4;
			    re[*returnSize] = (int*)malloc(sizeof(int)*4);
			    re[*returnSize][0] = nums[i];
			    re[*returnSize][1] = nums[j];
			    re[*returnSize][2] = nums[left];
			    re[*returnSize][3] = nums[right];
			    (*returnSize)++;
							
			    left++;
			    while((left<numsSize) && (nums[left] == nums[left-1])){
				left++;
			    }
			    right--;
			    while((right>=0) && (nums[right] == nums[right+1])){
				right--;
			    }
	                }
			else if((nums[i]+nums[j]+nums[left]+nums[right])<target){
			    left++;
			    while((left<numsSize) && (nums[left] == nums[left-1])){
			        left++;
			    }
			}
			else{
			    right--;
			    while((right>=0) && (nums[right] == nums[right+1])){
			        right--;
			    }
		        }
	            }
	        }
            }
        }
    }
   
    return re;
    
}

 

( 2 ) 搜寻法

/**
 * 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().
 */

void mergeSort(int* num, int numsSize);
void sortsub(int* num, int low, int high);
void merge(int* num, int low, int middleL, int middleR, int high);
bool binarySearch(int* nums, int left, int right, int target);

int cmp(const void* a, const void* b){
	return *(int*)a - *(int*)b;
}

int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes){

    *returnSize = 0;            // number of return pairs
    int step = 4;              // each memory alloc
    *returnColumnSizes = (int*)malloc(sizeof(int*)*step); 
    int** re = (int**)malloc(sizeof(int*)*step);

    
    qsort(nums, numsSize, sizeof(int), cmp);

	for(int i = 0; i<numsSize-3 ; i++){
        if(i!=0){                               //Jump Same num
            while(i<numsSize-3){
                if(nums[i]==nums[i-1])
                    i++;
                else
                    break;
            }
        }
        if(i<numsSize-3){
            for(int j = i+1; j<numsSize-2 ; j++ ){
                if(j!=i+1){                               //Jump Same num
                    while(j<numsSize-2){
                        if(nums[j]==nums[j-1])
                            j++;
                        else
                            break;
                    }
                }
                if(j<numsSize-2){
		    for(int k = j+1; k<numsSize-1 ; k++ ){
		        if(k!=j+1){
			    while(k<numsSize-1){
			        if(nums[k]==nums[k-1])
				    k++;
				else
				    break;
			    }
		    }
		    if(k<numsSize-1){
		        if(binarySearch(nums,k+1,numsSize-1,(target-nums[i]-nums[j]-nums[k]))){
			    if((*returnSize) != 0 && (*returnSize)%step == 0){
			        *returnColumnSizes = (int*)realloc(*returnColumnSizes, sizeof(int*) * ((*returnSize)+step));
				=re = (int**)realloc(re, sizeof(int*) * ((*returnSize)+step));
			    }
								
			    (*returnColumnSizes)[*returnSize] = 4;
			    re[*returnSize] = (int*)malloc(sizeof(int)*4);
			    re[*returnSize][0] = nums[i];
			    re[*returnSize][1] = nums[j];
			    re[*returnSize][2] = nums[k];
			    re[*returnSize][3] = target-nums[i]-nums[j]-nums[k];
			    (*returnSize)++;
			}
	            }
	          }
                }
            }
        }
    }
   
    return re;
    
}

bool binarySearch(int* nums, int left, int right, int target) {
    int middle;
    if (target < nums[left] || target > nums[right])
        return false;
    while (left <= right) {
        middle = (right + left) / 2;
        if (nums[middle] == target) {
            return true;
        }
        else if (target > nums[middle]) {
            left = middle + 1;
        }
        else {
            right = middle - 1;
        }
    }
    return false;
}

下方为时间与空间之消耗

( 1 ) 双指针法

Runtime: 48 ms, faster than 24.66% of C online submissions for 4Sum.
Memory Usage: 6.6 MB, less than 83.56% of C online submissions for 4Sum.

( 2 ) 搜寻法

Runtime: 56 ms, faster than 23.29% of C online submissions for 4Sum.
Memory Usage: 6.5 MB, less than 94.52% of C online submissions for 4Sum.

 

Linux平台CCS安装配置完整示例 手把手讲解在Linux系统中完成CCS安装与环境配置的全过程,涵盖关键步骤与常见问题解决,是查找ccs安装教程时不可多得的实战指南。 阅读详情

相关推荐

黑群晖断电后存储池‘已损毁’?别慌,SSH里这几条命令能救急

本文详细解析黑群晖断电后存储池显示‘已损毁’的紧急修复方法。通过SSH命令行工具,提供从诊断到修复的完整流程,包括RAID阵列重新组装、设备重建等关键步骤,帮助用户恢复数据访问。适用于因意外断电导致的存储池异常情况。

weixin_42651748的博客 375

15. 3Sum【力扣】

题意理解 给定一个数组,求三数之和等于0的集合 问题分析 对撞指针 + STL 先排序,建立起数组的遍历和数的大小关系。 定位三个数在数组的位置,第一个数从头开始,第二个数从第二位开始,第三个数从尾倒过来。 STL的next,prev,unique,erase组合操作整个序列。 提升效率:如果第一个数遍历时和前一个数相等,就跳过,继续处理下一个。 其他 链接 vect...

xiexie1357的专栏 432

幸狐RV1106开发板运行Yolo8示例

rknn_model_zoo 是瑞芯微官方提供的 RKNPU 支持的各种主流算法的部署示例,目前对 Luckfox Pico 所使用的 RV1103/RV1106 有限支持,最新的示例支持 mobilenet 模型部署和 yolo 模型部署,本章以部署 yolov8修改版本为例介绍 rknn_model_zoo 示例的使用。:可选项,用于指定 RKNN 模型的保存路径,默认保存在 ONNX 模型同一目录下,名称为 ‘yolov8.rknn’例如“rv1106”。

qq_42730522的博客 3224

LeetCode 18. 四数之和 4Sum(C语言)

题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意: 答案中不可以包含重复的四元组。 示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集...

hang404的博客 1658

习题6-3 使用函数输出指定范围内的完数

其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[mn]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

cutto的博客 862

AI驱动视频剪辑自动化:cutcli命令行工具重塑工作流

视频剪辑自动化是提升内容生产效率的关键技术,其核心原理在于通过程序化指令替代手动操作,将创意执行过程代码化。这项技术的价值在于能够将创作者从重复性劳动中解放,实现批量化、标准化的视频内容生产,尤其适用于社交媒体运营、产品宣传等高频产出场景。通过封装专业软件(如剪映/CapCut)的底层草稿格式,自动化工具在保证工业级渲染质量的同时,提供了可编辑的中间态,为AI智能体(Agent)与生产工具的结合提供了清晰接口。本文以cutcli为例,深入探讨了如何通过命令行工具和AI助手,构建从自然语言指令到可编辑视频草稿

weixin_27210125的博客 1063

LeetCode 18. 4Sum

一 题目 Given an arraynumsofnintegers and an integertarget, are there elementsa,b,c, anddinnumssuch thata+b+c+d=target? Find all unique quadruplets in the array which gives the sum ...

bohu83的博客 200

MultiOTP Credential Provider避坑指南:从安装到RDP双因素认证的全流程解析

本文详细解析了MultiOTP Credential Provider从安装到实现RDP双因素认证(MFA)的全流程,重点分享了Docker部署、Active Directory集成及网络级认证(NLA)兼容性等环节的实战避坑经验,旨在帮助运维人员高效、稳定地部署离线双因素认证方案,提升Windows远程桌面安全性。

weixin_29255731的博客 642

[Leetcode 18, medium] 4 Sum

[Leetcode 18, medium] 4 Sum

算法的实践 411

YOLO模型从10MB瘦到2MB!剪枝+INT8量化双方案(精度损失<1%,附部署代码)

摘要:本文介绍了一种针对边缘设备的YOLO模型轻量化方案,通过"结构化剪枝+INT8量化"组合技术,将YOLOv8n模型从6.4MB压缩至2MB,体积减少68.75%,推理速度提升80%,同时保持精度损失小于1%。文章详细讲解了剪枝工具选择、通道剪枝实现、量化校准等关键步骤,并提供了完整的代码示例。特别强调了剪枝保留率、校准集使用、微调必要性等实践要点,帮助开发者在树莓派等资源受限设备上实现高效目标检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 756

在 SAP 系统中设置成本中心(Cost Center)和利润中心(Profit Center)需在管理会计(CO)模块中完成,涉及主数据创建、组织结构配置等步骤

本文详细介绍了SAP系统中成本中心和利润中心的设置流程。成本中心设置包括:配置成本控制范围、定义标准层次结构、创建主数据(KS01/KS02/KS03)等步骤。利润中心设置需先激活利润中心会计功能,再定义标准层次并创建主数据(KE01/KE02/KE03)。关键是将成本中心与利润中心关联,实现成本数据自动流向利润中心。最后可通过相关报表验证设置是否生效。整个流程强调主数据创建和组织结构关联,以实现成本归集和利润分析功能。

金牌架构师 2220

【Leetcode】【Medium】4Sum

Given an arraySofnintegers, are there elementsa,b,c, anddinSsuch thata+b+c+d= target? Find all unique quadruplets in the array which gives the sum of target. Note: Elements in a...

weixin_30443813的博客 94

华为OD机试双机位C卷-用户入网定期复评(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【用户入网定期复评】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【用户入网定期复评】。

qq_45776114的博客 836

[LeetCode] 18.四数之和(Medium)C语言题解

题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 ①示例1 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] ...

wjy的博客 597

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Leetcode题medium11/15/16/18/31/33/34/39/40,Python多种解法(三)

前文   继上一篇:Leetcode题121/122/167/169/189/217/219/268/283,Python多种解法(二),这次开始分享数组medium的题,说实在的,到了中等题,很难自己过了,只有少部分和easy一样难度的题才能过,打击还是有的,不过还是继续刷吧,等二刷三刷的时候,相信自己的代码能力和算法能力应该会有提高的!那开始上题了! 11. Container With Mo...

weixin_42681866的博客 455

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LeetCode Index

一、数学问题 Easy 7. Reverse Integer [Easy] 172. Factorial Trailing Zeroes [Easy] 阶乘有几个0 263-264. Ugly Number I & II [Easy & Medium] 丑数系列 278. First Bad Version [Easy] 二分查找 509...

qq_35319215的博客 151

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【LeetCode】18、四数之和

题目等级:4Sum(Medium) 题目描述: Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array wh...

weixin_30765577的博客 151

[LeetCode] 15.三数之和(Medium)C语言题解

题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 ①示例1 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] ...

wjy的博客 1893

Leetcode刷题62-18. 四数之和(C++详细解法!!!)

题目来源:链接: [https://leetcode-cn.com/problems/4sum/submissions/] 18. 四数之和1.问题描述2.我的解决方案3.大神们的解决方案4.我的收获 1.问题描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target ...

qq_40858438的博客 551

[LeetCode] 454.四数相加 II(Medium)C语言题解

题目 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。 示例 ①示例1 输入: ...

wjy的博客 499

Leetcode哈希表类题目

242. Valid Anagram:Easy。unordered_map。 217. Contains Duplicate:Easy。unordered_set。 202. Happy Number:Easy。注意这里使用哈希表的方法和用途。不熟悉。 36. Valid Sudoku:Easy。利用数组模拟哈希表。不熟悉。 219. Contains Duplicate II:Easy。 299.

Bryan要加油 3251

Leetcode18.四数之和

Time: 20190920 Type: Medium 题目描述 给定一个包含n个整数的数组nums和一个目标值target,判断nums中是否存在四个元素a,b,c 和d ,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。 注意: 答案中不可以包含重复的四元组。 示例: 给定数组nums = [1, 0, -1, 0, -2, 2],和target = 0...

Bing's Blog 534

LeetCode 从零单刷个人笔记整理(持续更新)

更新至2019.4.19 本人博客用于个人对知识点的记录和巩固。之前刷了《剑指Offer》,基本每道题都用两种语言过了一遍,比较用心地进行原理和方法的剖析,并且用几乎所有可行的方法进行了实现和调优,大多数题目都附上了测试用例,少数题目进行了一些升级和扩充。感兴趣的话可以看这里:#程序员面试必备#《剑指Offer》从零单刷个人笔记整理(66题全) 刷完剑指Offer后下一步就是LeetCode了。下...

NJU_ChopinXBP的博客 4302

LeetCode Weekly Contest 110 (C++)

Welcome to the 110th LeetCode Weekly Contest 937. Reorder Log Files                -  Easy 938. Range Sum of BST             -  Medium 939. Minimum Area Rectangle    -  Medium 940. Distinct Subseq...

Bob__yuan的博客 272

Leetcode 40. Combination Sum II

40. Combination Sum II Total Accepted:76278 Total Submissions:265535 Difficulty:Medium Given a collection of candidate numbers (C) and a target number (T), find all unique ...

weixin_30725467的博客 69

【LeetCode】 454、四数之和 II

题目等级:4Sum II(Medium) 题目描述: Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero. To make problem a bit easier, all ...

weixin_30895603的博客 98
上一篇: LeetCode (力扣) 17. Letter Combinations of a Phon (C) - Medium (递归法)
下一篇: LeetCode (力扣) 19. Remove Nth Node From End of List (C) - Medium
JuzerTech
博客等级 码龄6年 7粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值