Leetcode c语言-3Sum
Title:
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
这道题目意思很容易理解,找到一个字符串中的三个数,三数相加为0,输出所有不重复的数字组合。以字符串数组的形式。
有几个难点:
1.字符串数组的初始化和空间分配。
2.如何降低时间复杂度,暴力解答容易超时。
针对第一个难点,对于字符串数组,可以看做是二维数组,s[][],第一个元素表示行,第二个表示列,也就是每一个子字符串中的第几个字符,比如,s[][]={{1,2,3},{4,5,6}},那么s[1][1]表示的就是5。
因此分配空间时,首先分配一个所有元素的空间,然后当要对每一个子字符串进行写入时,再具体分配子字符串的空间。
比如:
第一行表示为字符串数组result分配总空间。
int** result = (int**)malloc(sizeof(int)*(numsSize*(numsSize-1)*(numsSize-2))/6);
第二行表示为m行的子字符串分配3个int大小的空间,也就是这一个子字符串最多可以存储三个int大小的数据。
result[m]=(int*)malloc(sizeof(int)*3);
针对第二个难点,首先要数组元素进行排序,从小到大。然后再对排序后的数组处理。处理方法是选定选定第一个元素,然后从两边往中间推,如果三个元素相加==0,记录下来,然后左右各移一位,判断移位后的数据是否与移位前的相同,如果相同,则再移一位,确保不会重复。 如果元素相加大于0,右边的左移一位,再进行判断,如果小于0,左边的右移一位,再进行判断。
排序算法采用的是冒泡排序。
代码如下:
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
/*冒泡排序,flag的作用是判断如果发现有一次排序中没有数据交换,说明已经排序完毕,直接跳出*/
void bubblesort(int *nums, int numsSize) {
int i,j;
int temp;
int flag=1;
for (i=0;i<numsSize;i++) {
for (j=0;j<numsSize-1;j++) {
if (nums[j+1]<nums[j]) {
temp=nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
flag=0;
}
}
if (flag==1)
break;
}
}
int** threeSum(int* nums, int numsSize, int* returnSize) {
int** result = (int**)malloc(sizeof(int)*(numsSize*(numsSize-1)*(numsSize-2))/6);
int i,j,n;
int m=0;
int begin,end;
int sum;
if (numsSize<3) {
*returnSize=0;
return result;
}
bubblesort(nums,numsSize);
for (i=0;i<numsSize-2;i++) {
if (nums[i]>0)
break;
if (i>0 && nums[i]==nums[i-1])
continue;
begin=i+1;
end = numsSize-1;
while (begin<end) {
if ((nums[i]+nums[begin]+nums[end]) == 0) {
result[m]=(int*)malloc(sizeof(int)*3);
result[m][0]=nums[i];
result[m][1]=nums[begin];
result[m][2]=nums[end];
m++;
begin++;
end--;
while (begin<end && nums[begin]==nums[begin-1]) {
begin++;
}
while (begin<end && nums[end]==nums[end+1]) end--;
}
else if ((nums[i]+nums[begin]+nums[end]) >0)
end--;
else
begin++;
}
}
*returnSize=m;
return result;
}
posted on 2017-09-13 15:15 sichenzhao 阅读(174) 评论(0) 编辑 收藏 举报