c语言sizeof时间复杂度,算法15. 三数之和_(c语言版)

这篇博客介绍了一种利用双指针法解决LeetCode问题的方法,探讨如何在给定数组中查找是否存在三个元素满足a+b+c=0的条件,同时提供了示例和代码实现。时间复杂度为O(n^2),空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

##1. 题目描述

```shell

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:

[

[-1, 0, 1],

[-1, -1, 2]

]

```

##2. 测试结果

![](https://raw.githubusercontent.com/xidoublestar/image/master/pictures/20200521145243.png)

##3. 解法1_双指针法

```shell

/*

author: xidoublestar

date: 2020-5-21

*/

int compare(const void* a, const void* b)

{

return (*(int*)a - *(int*)b);

}

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {

//排除平台只输出]的bug

*returnSize = 0;

//排除输入小于3的情况

if (numsSize < 3)

return NULL;

//使用qsort函数快速排序

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

//申请二级指针空间

int** returnArray = (int**)malloc(sizeof(int*) * (numsSize - 2) * (numsSize - 2));

//申请每个一维数组大小的空间

*returnColumnSizes = (int*)malloc(sizeof(int) * (numsSize - 2) * (numsSize - 2));

int cur = 0, low = 0,high = 0;

//cur遍历数组,low和high分别做为左值和右值的下标往中间夹

while (nums[cur] <= 0 && cur < numsSize - 2) {

low = cur + 1;

high = numsSize - 1;

while (low < high) {

if (0 == (nums[cur] + nums[low] + nums[high])) {

returnArray[*returnSize] = (int*)malloc(sizeof(int) * 3);//每找到一组,二级指针分配3个空间

(*returnColumnSizes)[*returnSize] = 3;//记录列数

returnArray[*returnSize][0] = nums[cur];

returnArray[*returnSize][1] = nums[low];

returnArray[(*returnSize)++][2] = nums[high];

while ((nums[low] == nums[++low]) && (low < high));//往后去重

while ((nums[high] == nums[--high]) && (low < high));//往前去重

}

else if (0 < (nums[cur] + nums[low] + nums[high])) {

high--;

}

else {

low++;

}

}

while ((nums[cur] == nums[++cur]) && (cur < numsSize - 2));//cur左值去重

}

return returnArray;

}

```

## 4、复杂度分析

时间复杂度:O(n*n)

空间复杂度:O(1)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31442014/viewspace-2693524/,如需转载,请注明出处,否则将追究法律责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值