LeetCode-4Sum(九月千题鬼之历练 1/1000, 指针数组的初始化和调用)

该博客讨论了LeetCode中4Sum问题的解题方法,包括数组排序、重复数字处理以及如何初始化和使用指针数组以解决结果不确定的情况。文章提到了初始化时malloc分配内存以及在遍历过程中寻找满足条件的四元组的技巧。

Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
  • The solution set must not contain duplicate quadruplets.

    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

    A solution set is:
    (-1,  0, 0, 1)
    (-2, -1, 1, 2)
    (-2,  0, 0, 2)
给一个数组,nums, 有numsSize个数,问其中有多少种4个数字的subset之和等于target。

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int** fourSum(int* nums, int numsSize, int target, int* returnSize)

题目的tricks:
1) 数组元素个数可能小于4
2) 相同数字组成的set需要去重,例如: nums = [0, 0, 0, 0, 0, 0, 0],target=0, 仅有一组解,[0, 0, 0, 0]。
3) 由于结果的个数不可确定,指针数组的初始化的大小不确定,在最后需要mencpy。所以在最开始,初始化的时候,malloc了10000个sizeof(int*).

解题思路:
1)首先,将nums从小到大排序
2)取四个数,a, b, c, d 遍历一组4个数的下标,用暴力循环确定a -> 0 ~ numsSize - 4, b -> a ~ numsSize

for (a = 0; a <= numsSize - 4; ){
		for (b = a + 1; b <= numsSize - 3; ){
		        ..............	
			while (nums[b] == nums[b + 1] && b <= numsSize - 3){
				b++;
			}
			b++;
		}
		while (nums[a] == nums[a + 1] && a <= numsSize - 4){
			a++;
		}
		a++;
	}
3) c = b + 1, d = numsSize - 1
也就是说,保持始终a < b < c < d.
4)当nums[a] + nums[b] + nums[c] + nums[d] > target 的时候,说明nums[d]太大,d--;
nums[a] + nums[b] + nums[c] + nums[d] < target的时候,说明nums[c]太小, c++;
nums[a] + nums[b] + nums[c] + nums[d] = target 的时候,(nums[a], nums[b], nums[c], nums[d])为一组解,保存;
Tips: 当改变a, b, c, d的时候,确保改变之后对应的数值和之前的值不相同,以免出现重复的解。

指针数组的初始化和调用:
变量:int **point
初始化:point = (int**)malloc(sizeof(int*) * NUM)
赋值:int *block = (int*)malloc(sizeof(int*) * BLOCK_NUM);
           block[0] = 3; block[1] = 4; block[2] = 5;

  point[i] = block;
调用:point[0][0] = 3; 

代码如下:
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>

#define MAX_NUM 10000

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int** fourSum(int* nums, int numsSize, int target, int* returnSize) {
	if (numsSize < 4){
		return NULL;
	}

	int a, b, c, d;
	int **result;
	int **tmp_result;
	int *tmp_loc;
	int i, j;
	int sum, tmp;

	*returnSize = 0;
	result = (int **)malloc(sizeof(int *) * (MAX_NUM));

	for (i = 0; i < numsSize; i++){
		for (j = 0; j < numsSize - i - 1; j++){
			if (nums[j] > nums[j + 1]){
				tmp = nums[j];
				nums[j] = nums[j + 1];
				nums[j + 1] = tmp;
			}
		}
	}


	for (a = 0; a <= numsSize - 4; ){
		for (b = a + 1; b <= numsSize - 3; ){
			for (c = b + 1, d = numsSize - 1; c < d; ){
				sum = nums[a] + nums[b] + nums[c] + nums[d];
				if (sum < target){
					while (nums[c] == nums[c + 1] && c < d){
						c++;
					}
					c++;
				}
				else if (sum > target){
					while (nums[d] == nums[d - 1] && c < d){
						d--;
					}
					d--;
				}
				else if (sum == target){
					tmp_loc = (int*) malloc(sizeof(int) * 4);
					tmp_loc[0] = nums[a];
					tmp_loc[1] = nums[b];
					tmp_loc[2] = nums[c];
					tmp_loc[3] = nums[d];

					result[*returnSize] = tmp_loc;

					*returnSize = *returnSize + 1;

					while (nums[c] == nums[c + 1] && c < d){
						c++;
					}
					c++;		
					while (nums[d] == nums[d - 1] && c < d){
						d--;
					}
					d--;
				}

			}
			while (nums[b] == nums[b + 1] && b <= numsSize - 3){
				b++;
			}
			b++;
		}
		while (nums[a] == nums[a + 1] && a <= numsSize - 4){
			a++;
		}
		a++;
	}

	tmp_result = (int **)malloc(sizeof(int *) * (*returnSize));
	memcpy(tmp_result, result, *returnSize * sizeof(int*));

	free(result);

	return tmp_result;
}


int main(void){
	int arr[] = {1,-2,-5,-4,-3,3,3,5};
	int target = -11;
	int size = 8;
	int i, j;
	int returnSize;
	int **result;

	result = fourSum(arr, size, target, &returnSize);

	printf("%d\n", returnSize);

	for (i = 0; i < returnSize; i++){
		for (j = 0; j < 4; j++){
			printf("%d, ", result[i][j]);
		}
		printf("\n");
	}
	return 0;
}
源码直接下载地址: https://pan.quark.cn/s/be6e03a195a4 该资源为"108大型通信技术有限公司"提供的网站源代码,其功能完整性经过测试的状态已得到确认。这段源代码可作为极具价值的参考资料,不仅适用于通信技术在网站开发中的学习应用,也适合作为毕业设计项目的基础。以下列出了源代码中可能涵盖的关键知识点及详尽说明: 1. **前端框架与库**:网站极有可能运用了主流的前端框架,例如Bootstrap或AngularJS,或者自行设计的HTML、CSSJavaScript。这些框架提供了一套完整的用户界面组件,有效简化了页面的布局交互设计过程。 2. **响应式设计**:鉴于该网站属于大型通信技术公司,源代码大概率集成了响应式设计,确保网站在不同设备(包括手机、平板及桌面电脑)上均能提供优质的用户体验。 3. **通信协议与API**:源代码可能涉及HTTP/HTTPS协议,用于客户端与服务器之间的数据传输。若网站具备实时通信功能,则可能采用了WebSocket或其他实时通信协议。此外,可能还包括与其他服务或系统的API接口,例如RESTful API。 4. **后端技术**:网站的后端可能选用了Java(Spring Boot)、Python(Django或Flask)、Node.js(Express)等服务器端框架。后端主要负责处理业务逻辑、数据库操作用户认证等任务。 5. **数据库管理**:源代码中可能包含SQL查询,表明使用了关系型数据库(如MySQL、PostgreSQL),或者NoSQL数据库(如MongoDB)。数据库设计对于存储检索大量通信数据具有关键作用。 6. **安全性**:源代码应包含多项安全措施,如C...
内容概要:本文系统阐述了基于Wasserstein生成对抗网络(W-GAN)的光伏出力场景生成方法,旨在通过深度学习技术精准刻画光伏发电功率的时间序列不确定性。研究构建了完整的W-GAN模型架构,详细介绍了其在网络结构设计、损失函数优化(引入Wasserstein距离提升训练稳定性)及训练流程上的关键技术细节,并提供了完整的Python代码实现。该方法能够生成高保真、多样化的光伏功率出力场景,有效克服传统方法在捕捉复杂概率分布时序相关性方面的局限性,为处理新能源出力不确定性问提供了先进的数据驱动解决方案。; 适合人群:具备Python编程能力及机器学习基础知识,专注于新能源发电预测、电力系统规划、电力市场分析、综合能源系统优化等领域研究的高校研究生、科研机构研究人员及电力企业技术人员。; 使用场景及目标:①掌握W-GAN在新能源时序数据生成中的高级应用技巧;②构建高精度的光伏出力不确定性模型,生成用于鲁棒优化与随机规划的多场景集;③支撑高比例可再生能源接入下的电力系统可靠性评估、储能配置、经济调度及风险管控等关键决策; 阅读建议:建议读者务必结合所提供的Python代码进行动手实践,深入理解模型的超参数设置、训练动态监控与收敛性判断方法,并尝试将该方法与文中提及的DDPM、条件GAN等其他前沿生成模型进行对比实验,以深化对不同生成模型特性的认识,拓展解决实际科研问的技术路径。
内容概要:本文详细阐述了工业母机技术领域中“高级结构设计工程师”这一岗位的全方位任职要求与职业发展路径,涵盖职位对标、目标企业、学历与证书要求、年龄范围、管理半径、晋升关键点、必备工作经验年限以及薪资待遇区间。重点突出该岗位对高端数控机床核心结构(如床身、主轴箱、导轨等)设计能力的要求,强调有限元分析、精度控制、热变形补偿、振动抑制等核心技术能力,并明确指出需具备项目主导经验、团队管理能力跨部门协作经验。同时,根据不同企业类型发展阶段,给出了清晰的年薪划分标准,体现了市场对该岗位的技术深度与综合能力的高度认可。; 适合人群:具备5年以上工业母机或高端机床结构设计经验,致力于向高级工程师、技术专家或管理岗位发展的结构设计从业者;或希望转型进入高端装备制造业的精密机械研发人员。; 使用场景及目标:①用于求职者精准定位职业发展方向,评估自身与高级岗位之间的能力差距;②辅助企业制定人才招聘标准与薪酬体系;③指导技术人员规划技能提升路径,聚焦核心技术积累与项目经验沉淀。; 阅读建议:建议结合个人职业发展阶段对照文中各项指标进行自我诊断,重点关注“晋升关键点”与“必备年限”部分,有针对性地补齐技术短板、积累主导项目经验,并注重专利成果与团队管理能力的培养,以全面提升竞争力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值