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

SECS/GEM EAP 设备自动化功能原理和设计方案 半导体SECS GEMEAP实现了对生产线上机台的实时监控,是工厂自动化不可缺少的控制系统。EAP系统与FAB中的机台紧密相关,系统的设计与开发必须与生产线的机台实际生产流程相一致,才能达到控制机台生产的目的。 EAP SECS/GEM是MES与设备的桥梁,EAP通过SECS国际标准协议与机台进行数据传输。SECS是半导体设备(半导体行业称设备为机台)必须遵循的一种国际通信协议。EAP就是通过SECS与设备通信、传输数据、发送指令控制设备按照预先定义........ 阅读详情

同步发于 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.

 

MDK开发篇:基于立创逻辑派FPGA-G1与Cortex-M1软核的按键控制LED实战 本文详细介绍了基于立创逻辑派FPGA-G1开发板与高云Cortex-M1软核的完整开发流程。通过Gowin云源软件配置软核系统与GPIO外设,并在Keil MDK环境中编写按键控制LED的C程序,最终实现程序固化与上电自启动。教程涵盖硬件配置、软件开发、在线调试与固化部署全步骤,帮助STM32开发者快速上手FPGA软核开发。 阅读详情

相关推荐

Bootloader Design of PIC18 series MCU

注意:下列描述是在PIC单片机上启用Bootloader的一个相关知识的近似完备集。所有需要了解的,与bootloader与用户态程序交互的理论知识都已给出。包含内存组织,跳转,中断等必备功能的描述。

含光左卫的工作笔记集 1267

15. 3Sum【力扣】

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

xiexie1357的专栏 432

SAP-ABAP:SAP中如何查看系统表之间的关联关系?

在业务逻辑开发或者ALV开发过程中,我们通常要从系统中找出几个标准表之间的关联关系,有的是head与item,通过外键进行关联的关系。那么怎么去找到呢?以上就是具体如何产看系统表之间的关联关系的步骤,对于不同代码的业务顾问,也是必须要掌握的。

LinkStar的博客 2430

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

电商平台大数据分析指标

一、五大关键数据分析指标 1.1活跃用户量 活跃用户量是一个基本的指标,有 DAU(日活跃用户)、WAU(周活跃用户)和 MAU(月活跃用户)三个层次; 1.2转化 转化是一个非常重要的指标,电商运营需要关注主路径、次路径甚至精细到每一个品类 / SKU 的转化率; 1.3留存 留存要从不同的时间周期上研究,包括次日留存率、3 日、7 日、30 日留存; 1.4复购 复购则要从 3 个角度去看,复购用户量、复购率和复购金额比; 1.5GMV GMV 是最重要的指标,我们的运营最终是围绕这

默主归沙的博客 4818

ComfyUI的G-Dino模型加载器报错解决方案:从崩溃到重生

遇到G-Dino模型加载器报错不要慌,按照本文的步骤操作,99%的问题都能解决。模型文件正确下载到指定位置segment_anything节点安装完整且无冲突需要补充更多细节或故障排除方法吗?可以随时告诉我。

2301_78150483的博客 4023

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

银行会计第2课:交易和核算分离的思想

核算作为会计的基础,将交易转化为可量化的信息,而会计则通过整合核算结果,实现对经济活动的全面把控。- 本质:指企业或主体之间发生的、能引起经济利益变动的具体事项,比如采购商品、销售货物、支付工资等,是客观发生的经济事实。可售产品(业务视角的核算对象) + 属性条件(核算的分类,限制等) = 核算类型(会计视角,含有科目分类内容)- 核算:会计人员根据采购发票、入库单等,将这笔交易记为“借:原材料,贷:银行存款”(对事实的会计处理)。- 特点:是核算的源头,不涉及会计处理,仅代表经济行为的发生。

ademen的博客 498

[Leetcode 18, medium] 4 Sum

[Leetcode 18, medium] 4 Sum

算法的实践 411

【WRF-GHG 教程第一期】概述(Overview)

概述(Overview)

WW、forever的博客 509

【100%通过率】华为OD机试真题 C 实现【最多等和不相交连续子序列】【2022.11 Q4 新题】

给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。求一组连续子序列,组内子序列的数目最多。输出这个数目。

MISAYAONE的博客 1万+

【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

【我的Android进阶之旅】Android自定义View实现一个游戏摇杆,来实现监听遥动的方向或者监听摇动的角度的功能

一、需求描述 去年有个需求,需要使用自定义View实现一个游戏摇杆,来识别上下左右摇动的方向。 有点类似下面这样的王者荣耀游戏摇杆的效果 二、业界已有的参考资料 在下面这篇博客介绍了如何自定义游戏摇杆 2.1 博客介绍 Android自定义摇杆 2.1.1 功能 支持自适应大小 支持2个方向、4个方向、8个方向的摇动监听 支持摇动角度获取 可选回调模式 支持可摇动区域自定义 支持摇杆自定义 支持设置图片、色值、Shape图形 2.1.2 效果图 2.1.3 设置回调方式 setCallBac

字节卷动 1409

[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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【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、付费专栏及课程。

余额充值